Skip to main content
 首页 » 编程设计

python之Pandas:将每一行转换为 column name,row value> 字典并添加为新列

2025年05月04日14Free-Thinker

我有一个 df 这样的

          STATUS_ID               STATUS_NM 
0                 1                A 
1                 2                B 
2                 3                C 
3                 4                D 

我想通过 apply 执行一行,为单独列中的每一行获取一个键、值 par。最后的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...

我相信是我的 pandas 版本导致了这个问题。这已在此处讨论 - https://github.com/pandas-dev/pandas/issues/8735 所以问题是是否有另一种方法可以执行相同的操作来规避此问题。我无法将 Pandas 版本更新到 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} 

如果在您的真实 DataFrame 中您还有其他列,您可能需要指定您希望在字典中包含的列。

cols = ['STATUS_ID', 'STATUS_NM'] 
df['STATUS'] = df[cols].apply(pd.Series.to_dict, axis=1) 

另一种方法是遍历 DataFrame:

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'}] 

您可以直接将其分配给您的 DataFrame:

df['STATUS'] = lst