Pandas:将包含dict值列表的列解压缩到多个列

时间:2017-09-14 13:49:06

标签: python pandas apply

我有一个看起来像这样的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中的每个键添加其他列。 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特定应用或其他功能可以使这更快,但无法这样做。如果有一个非常快速的方法来做到这一点,我将非常感激。感谢。

1 个答案:

答案 0 :(得分:3)

试试这个:)

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