Pandas:将包含 dict 值列表的列解压为多列

Fiz*_*izi 1 python apply pandas

我有一个看起来像这样的 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}] 
Run Code Online (Sandbox Code Playgroud)

我需要解压缩第 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 
Run Code Online (Sandbox Code Playgroud)

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

WeN*_*Ben 5

尝试这个 :)

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
Run Code Online (Sandbox Code Playgroud)

数据输入

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}]]   })
Run Code Online (Sandbox Code Playgroud)