【问题标题】:Pandas: convert each row to a <column name,row value> dict and add as a new columnPandas:将每一行转换为 <column name,row value> 字典并添加为新列
【发布时间】:2017-08-10 22:17:07
【问题描述】:

我有一个这样的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) 但我没有得到实际的字典,而是得到 &lt;built-in method values of dict object at 0x00...

我相信是我的 pandas 版本导致了这个问题。这已经在这里讨论过 - https://github.com/pandas-dev/pandas/issues/8735 所以问题是是否有另一种方法来执行相同的操作来规避这个问题。我无法将我的 Pandas 版本更新到 0.17

【问题讨论】:

  • 您在为哪一部分苦苦挣扎?定义字典?从表中获取每一行?添加新列?删除旧列?在您的问题中尽量具体,以便我们提供帮助。
  • 请查看我的更新。谢谢
  • @Fizi 我添加了一个显式循环解决方案。请检查。
  • @ayhan 谢谢。我实际上是想摆脱对行的迭代,因此是我的问题。但是如果不更新我的熊猫版本,似乎没有办法做到这一点。感谢您的帮助!

标签: python pandas numpy apply


【解决方案1】:
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

【讨论】:

  • 由于某些奇怪的原因,当我执行此操作时,我得到
  • @Fizi 你能发布产生这些值的代码吗?
  • 我不能由于专有原因,但如果这里提供的代码应该可以工作,那么我会调查是什么导致我的不能工作
猜你喜欢
  • 1970-01-01
  • 2018-08-26
  • 2018-02-02
  • 2021-08-15
  • 2014-01-05
  • 2021-11-28
  • 1970-01-01
相关资源
最近更新 更多