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 或其他功能可以使这更快,但未能这样做。如果有一种非常快速的方法可以做到这一点,我将不胜感激。谢谢。
尝试这个 :)
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)
| 归档时间: |
|
| 查看次数: |
3044 次 |
| 最近记录: |