规范化dict列表时保留附加列

2024-04-24 15:22:11 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个包含id和dict列表的数据帧:

df = pd.DataFrame({
    'list_of_dicts': [[{'a': 1, 'b': 2}, {'a': 11, 'b': 22}],
                      [{'a': 3, 'b': 4}, {'a': 33, 'b': 44}]],
    'id': [100, 200]
})

我想把它正常化如下:

    id   a   b
0  100   1   2
0  100   3   4
1  200  11  22
1  200  33  44

这是最重要的:

pd.concat([
    pd.DataFrame.from_dict(item)
    for item in df.list_of_dicts
])

但是缺少id列。你知道吗

我最感兴趣的是可读性。你知道吗


Tags: of数据infromiddataframedf列表
2条回答

这样怎么样:

d = {
    'list_of_dicts': [[{'a': 1, 'b': 2}, {'a': 11, 'b': 22}],
                     [{'a': 3, 'b': 4}, {'a': 33, 'b': 44}]],
    'id': [100, 200]
}

df = pd.DataFrame([pd.Series(x) for ld in d['list_of_dicts'] for x in ld])
id = [[x]*len(l) for l,x in zip(d['list_of_dicts'],d['id'])]
df['id'] = pd.Series([x for l in id for x in l])

编辑-这里有一个更简单的版本

t = [[('id', i)]+list(l.items()) for i in d['id'] for ll in d['list_of_dicts'] for l in ll]

df = pd.DataFrame([dict(x) for x in t])

而且,如果您确实想首先使用id列,可以从collections模块将dict更改为OrderedDict。你知道吗

这就是我所说的不理解

pd.DataFrame(
    *list(map(list, zip(
        *[(d, i) for i, l in zip(df.id, df.list_of_dicts) for d in l]
    )))
).rename_axis('id').reset_index()

    id   a   b
0  100   1   2
1  100  11  22
2  200   3   4
3  200  33  44

相关问题 更多 >