2017-09-14 34 views
-1

我有一个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和字典中的每个键的附加列。字典中的键值对是固定的。

  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多秒,这是不可接受的。我希望使用熊猫具体适用或其他功能可以使这个更快,但一直没有能够这样做。如果有一个非常快的方法来做到这一点,我会非常感激。谢谢。

回答

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

嗨。谢谢您的帮助。这是否依赖于df中的列数。 Iam得到ValueError:长度不匹配:期望轴有2个元素,新值有5个元素。我有更多的列不只是COL1和COL2。并且在词典中有5个键值对 – Fizi

+0

Nevermind!它效果很好。唯一会引起争议的是列级别* *是否可以深入了解你正在做的事情。它真的很酷,我很想了解它 – Fizi

+0

@Fizi我把它称为unlistify或unnest问题,你可以在这里查看,https://stackoverflow.com/questions/45885143/explode-lists-with-different-lengths-in-熊猫/ 45885337#comment78730894_45885337 – Wen