Pandas - 标准化 Json 列表
Pandas - normalize Json list
我正在尝试规范化 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
尝试
尝试使用 pandas json_normalize 解决问题,遵循文档 here。我对下面的 none 为什么有效以及哪种类型的 record_path 可以解决我的问题感到困惑。以下所有错误。
pd.json_normalize(data['bids'])
pd.json_normalize(data['bids'],['price','quantity'])
pd.json_normalize(data['bids'],[['price','quantity']])
使用 DataFrame.explode
on column bids
then create a new dataframe from the dictionaries in exploded bids
column and use DataFrame.join
到 join
它与 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
添加另一种方法 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())
或者您也可以像@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 数据框中的一列,该列是字典列表(可能会丢失)。
重现示例
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
尝试
尝试使用 pandas json_normalize 解决问题,遵循文档 here。我对下面的 none 为什么有效以及哪种类型的 record_path 可以解决我的问题感到困惑。以下所有错误。
pd.json_normalize(data['bids'])
pd.json_normalize(data['bids'],['price','quantity'])
pd.json_normalize(data['bids'],[['price','quantity']])
使用 DataFrame.explode
on column bids
then create a new dataframe from the dictionaries in exploded bids
column and use DataFrame.join
到 join
它与 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
添加另一种方法 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())
或者您也可以像@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