熊猫:每一行转换为<列名,行值>字典并添加为新列
问题描述:
我有一个DF使得熊猫:每一行转换为<列名,行值>字典并添加为新列
STATUS_ID STATUS_NM
0 1 A
1 2 B
2 3 C
3 4 D
我想执行行应用于一键搞定,值单独列中的每行的值。最终的DF应该
STATUS
0 {STATUS_ID:1,STATUS_NM:A}
1 {STATUS_ID:2,STATUS_NM:B}
2 {STATUS_ID:3,STATUS_NM:C}
3 {STATUS_ID:4,STATUS_NM:D}
更新: 我试图df[cols].apply(pd.Series.to_dict, axis=1)
和df[cols].apply(lambda x: x.to_dict(), axis=1)
而是获得实际的字典,我得到 <built-in method values of dict object at 0x00...
我相信它我的熊猫的版本,导致问题。这已经在这里讨论 - https://github.com/pandas-dev/pandas/issues/8735 所以问题是如果有另一种方式来执行相同的操作绕过这个问题。我不能更新我的熊猫版0.17
答
df['STATUS'] = df.apply(pd.Series.to_dict, axis=1)
df
Out:
STATUS_ID STATUS_NM STATUS
0 1 A {'STATUS_NM': 'A', 'STATUS_ID': 1}
1 2 B {'STATUS_NM': 'B', 'STATUS_ID': 2}
2 3 C {'STATUS_NM': 'C', 'STATUS_ID': 3}
3 4 D {'STATUS_NM': 'D', 'STATUS_ID': 4}
如果你的真实数据帧你有其他列也一样,你可能需要指定你想在字典中的列。
cols = ['STATUS_ID', 'STATUS_NM']
df['STATUS'] = df[cols].apply(pd.Series.to_dict, axis=1)
另一种方法是在数据框迭代:
lst = []
for _, row in df[cols].iterrows():
lst.append({col: row[col] for col in cols})
这将创建一个列表:
[{'STATUS_ID': 1, 'STATUS_NM': 'A'},
{'STATUS_ID': 2, 'STATUS_NM': 'B'},
{'STATUS_ID': 3, 'STATUS_NM': 'C'},
{'STATUS_ID': 4, 'STATUS_NM': 'D'}]
您可以直接分配给你的数据帧:
df['STATUS'] = lst
你在挣扎着什么?定义一本字典?从表中获取每一行?添加一个新列?删除旧的列?尽量在您的问题上尽可能具体,以便我们能够提供帮助。 –
请参阅我的更新。谢谢 – Fizi
@Fizi我添加了一个显式循环解决方案。请检查。 – ayhan