熊猫:每一行转换为<列名,行值>字典并添加为新列

问题描述:

我有一个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

+0

你在挣扎着什么?定义一本字典?从表中获取每一行?添加一个新列?删除旧的列?尽量在您的问题上尽可能具体,以便我们能够提供帮助。 –

+0

请参阅我的更新。谢谢 – Fizi

+0

@Fizi我添加了一个显式循环解决方案。请检查。 – ayhan

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 
+0

由于某些奇怪的原因,当我做这个操作时,我得到 Fizi

+0

@Fizi你可以发布产生这些值的代码吗? – ayhan

+0

我不能由于专有的原因,但如果在这里提供的代码应该工作,那么我会看看是什么导致我的不工作 – Fizi