问题描述
我正在尝试对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,尝试使用熊猫json_normalize进行解析。为什么下面的方法都不起作用,以及哪种类型的record_path可以解决我的问题,我感到困惑。以下所有错误。
pd.json_normalize(data['bids'])
pd.json_normalize(data['bids'],['price','quantity'])
pd.json_normalize(data['bids'],[['price','quantity']])
解决方法
在列bids
上使用DataFrame.explode
,然后从展开的bids
列的字典中创建一个新的数据框,并使用DataFrame.join
和{{1 }}:
join
结果:
df
,
使用np.repeat
和np.concatenate
使用json_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())
或者您也可以使用{Shutham提到的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