Pandas - 规范化 Json 列表

Posted

技术标签:

【中文标题】Pandas - 规范化 Json 列表【英文标题】:Pandas - normalize Json list 【发布时间】:2020-12-11 01:21:41 【问题描述】:

我正在尝试规范化 Pandas 数据框中的列,该列是字典列表(可能会丢失)。

复制示例

import pandas as pd
bids = pd.Series([['price': 606, 'quantity': 28,'price': 588, 'quantity': 29,
                   'price': 513, 'quantity': 33],[],['price': 7143, 'quantity': 15,
                    'price': 68, 'quantity': 91,'price': 6849, 'quantity': 12]])
data = pd.DataFrame([1,2,3]).rename(columns=0:'id')
data['bids'] = bids

期望的输出

id price quantity
1  606    28
1  588    29
1  513    33
3  7143   15
3  68     91
3  6849   12

尝试

按照文档here 尝试使用 pandas json_normalize 解决。我很困惑为什么以下方法都不起作用,以及什么类型的 record_path 可以解决我的问题。以下所有错误。

pd.json_normalize(data['bids'])
pd.json_normalize(data['bids'],['price','quantity'])
pd.json_normalize(data['bids'],[['price','quantity']])

【问题讨论】:

【参考方案1】:

bids 列上使用DataFrame.explode,然后从爆炸的bids 列中的字典创建一个新数据框,并将DataFrame.joinjoin 一起使用df

df = data.explode('bids').dropna(subset=['bids']).reset_index(drop=True)
df = df.join(pd.DataFrame(df.pop('bids').tolist()))

结果:

print(df)
   id  price  quantity
0   1    606        28
1   1    588        29
2   1    513        33
3   3   7143        15
4   3     68        91
5   3   6849        12

【讨论】:

【参考方案2】:

np.repeatnp.concatenatejson_normalize 添加另一种方法

out = pd.io.json.json_normalize(np.concatenate(data['bids']))
out.insert(0,'id',np.repeat(data['id'],data['bids'].str.len()).to_numpy())

或者您也可以使用@Shubham 提到的np.hstack 而不是np.concatenate

out = pd.io.json.json_normalize(np.hstack(data['bids']))

print(out)

   id  price  quantity
0   1    606        28
1   1    588        29
2   1    513        33
3   3   7143        15
4   3     68        91
5   3   6849        12

【讨论】:

以上是关于Pandas - 规范化 Json 列表的主要内容,如果未能解决你的问题,请参考以下文章

如何通过 Python Pandas 正确规范化 json

Pandas 规范化字典列表

pandas DataFrame:规范化一个 JSON 列并与其他列合并

如何在 Python 中规范化包含列表(应保存为列表)的 json 文件熊猫?

在 Pandas 数据框中使用 JSON 数据规范化列

如何将嵌套的 JSON 键规范化为 pandas 数据帧