【问题标题】:Pandas: unpack a column with list of dict values into multiple columnsPandas:将包含 dict 值列表的列解压缩为多列
【发布时间】:2018-02-23 13:06:47
【问题描述】:

我有一个看起来像这样的 df

            COL1   COL2    COL3                             
0         ABC      N       [{u'PERF_PCT': 0.2,u'PERF_DATE': 12},{u'PERF_PCT': 0.3,u'PERF_DATE': 13}]
1         XYZ      N       [{u'PERF_PCT': 0.6,u'PERF_DATE': 12},{u'PERF_PCT': 0.2,u'PERF_DATE': 13},{u'PERF_PCT': 0.7,u'PERF_DATE': 14}] 

我需要解压缩第 3 列,以便数据框为 COL3 列表中的每个字典添加额外的行,并为字典中的每个键添加额外的列。 dict中的键值对是固定的。

          COL1    COL2     PERF_PCT       PERF_DATE              
0         ABC      N       0.2            12
1         ABC      N       0.3            13
2         XYZ      N       0.6            12 
3         XYZ      N       0.2            13
4         XYZ      N       0.7            14 

我已经能够使用 for 循环来完成相同的任务,但我需要一些非常高性能的东西。结果 df 可以有大约 170k 条记录,当前使用 for 循环大约需要 20 多秒,这是不可接受的。我希望使用 pandas 特定的 apply 或其他功能可以使这更快,但无法做到。如果有一种非常快速的方法可以做到这一点,我将不胜感激。谢谢。

【问题讨论】:

    标签: python pandas apply


    【解决方案1】:

    试试这个:)

    Idx=df.set_index(['COL1','COL2']).COL3.apply(pd.Series).stack().index
    
    pd.DataFrame(df.set_index(['COL1','COL2']).COL3.apply(pd.Series).stack().values.tolist(),index=Idx).reset_index().drop('level_2',1)
    
    Out[318]: 
      COL1 COL2  PERF_DATE  PERF_PCT
    0  ABC    N         12       0.2
    1  ABC    N         13       0.3
    2  XYZ    N         12       0.6
    3  XYZ    N         13       0.2
    4  XYZ    N         14       0.7
    

    数据输入

    df = pd.DataFrame({'COL1':['ABC','XYZ'],
                  'COL2': ['N','N'],
                   'COL3' :[[{u'PERF_PCT': 0.2,u'PERF_DATE': 12},{u'PERF_PCT': 0.3,u'PERF_DATE': 13}],[{u'PERF_PCT': 0.6,u'PERF_DATE': 12},{u'PERF_PCT': 0.2,u'PERF_DATE': 13},{u'PERF_PCT': 0.7,u'PERF_DATE': 14}]]   })
    

    【讨论】:

    • 嗨。谢谢您的帮助。这是否取决于 df.我得到 ValueError:长度不匹配:预期轴有 2 个元素,新值有 5 个元素。我有更多的列,而不仅仅是 COL1 和 COL2。并且字典中有5个键值对
    • 没关系!它工作得很好。唯一会改变的是列 level_* 是否有可能深入了解您正在做的事情。它真的很酷,我很想了解它
    • @Fizi 我称之为 unlistify 或 unnest question,你可以在这里查看,stackoverflow.com/questions/45885143/…
    • 如果我不想扩展的任何列是列表怎么办?然后我得到TypeError: unhashable type: 'list'
    猜你喜欢
    • 2021-07-10
    • 2018-12-03
    • 2020-12-12
    • 1970-01-01
    • 2022-01-25
    • 1970-01-01
    • 2018-12-15
    • 2018-07-16
    • 1970-01-01
    相关资源
    最近更新 更多