我有一个数据框,其中一列有一个字典列表,在此字典中,我有要创建的列的名称及其值。
id stats opta_id
0 1307 [{name: 'speed', value: 5},{name: 'strength', value: 10}....] p176278
1 2410 [{name: 'vision', value: 5}, {name: 'strength', value: 10}....] p118335
2 200 [{name: 'speed', value: 5},{name: 'vision', value: 10}....] p92187
3 3314 [{name: 'speed', value: 5},{name: 'strength', value: 10}....] p154976
4 9223 [{name: 'speed', value: 5},{name: 'strength', value: 10}....] p446990
列表最多可以包含80个元素,并且每一行的长度都不相同。
如何平整此列以获得类似于此的内容?
id stats.speed stats.strength stats.vision ..... opta_id
0 1307 5 10 nan ..... p176278
1 2410 nan 5 10 ..... p118335
.
.
.
谢谢!
答案 0 :(得分:1)
在这里,我将首先从stats列创建的字典列表中构建一个临时数据框,然后将其与其余列连接起来
tmp = pd.DataFrame([{d['name']: d['value'] for d in row}
for row in df['stats']]).rename(
columns=lambda x: 'stats.' + x)
df = pd.concat([df['id'], tmp, df['opta_id']], axis=1)
使用显示的数据,它给出:
id stats.speed stats.strength stats.vision opta_id
0 1307 5.0 10.0 NaN p176278
1 2410 NaN 10.0 5.0 p118335
2 200 5.0 NaN 10.0 p92187
3 3314 5.0 10.0 NaN p154976
4 9223 5.0 10.0 NaN p446990
答案 1 :(得分:0)
最后,我找到了解决问题的方法。首先,我在时间数据帧中创建了该列的每一行
tmp = pd.concat([pd.DataFrame(x) for x in df['stats']], keys=df.index).reset_index(level=1, drop=True)
然后,我用'name'列并使用stat作为值
pivot = pd.pivot_table(tmp, columns='name', index=df_stats.index.values, values='stat')