2017-09-14 64 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