2017-09-14 13 views
-1

私はデータフレームがリスト内の各辞書のための追加の行を有するように、カラム3を解凍する必要があり、このパンダ:複数の列に辞書値のリストを持つ列を解凍

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

のように見えるDFを持っています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 +秒がかかり、これは容認できません。私はパンダを使用することを望んでいる特定の適用または他の機能はこれを速くすることができるがそうすることができなかった。これを行うための非常に速い方法があれば、本当に感謝しています。ありがとう。

答えて

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の列数に依存します。 ValueErrorを取得しています:長さの不一致:予想される軸に2つの要素があり、新しい値に5つの要素があります。 COL1とCOL2以外の列もあります。そして、辞書には5つのキーと値のペアがあります。 – Fizi

+0

Nevermind!それは素晴らしい作品です。チャネージするのは列レベルだけです*あなたがしていることを少し深く理解することは可能でしょうか?それは本当にクールだと私はそれを理解することが大好きだ – Fizi

+0

@ Fizi私はそれをunlistifyまたは不確かな質問と呼ばれ、ここで確認することができます、https://stackoverflow.com/questions/45885143/explode-lists-with-different-lengths-in- pandas/45885337#comment78730894_45885337 – Wen

関連する問題