从列的字典列表中创建数据框列

时间:2020-03-11 15:40:46

标签: python pandas

我有一个数据框,其中一列有一个字典列表,在此字典中,我有要创建的列的名称及其值。

    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
.
.
.

谢谢!

2 个答案:

答案 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')