提问人:KurczakChrupiacy2 提问时间:11/11/2023 更新时间:11/11/2023 访问量:51
Pandas 在 Dataframe 中处理字典
Pandas handling Dictionary inside Dataframe
问:
我的代码:
d = [{"cityId": 111, "regionId": 111, 'data':[{'code': 'ABC', 'date': '2023-11-11 02:00', 'value': 300}, {'code': 'ABC', 'date': '2023-11-12 02:00', 'value': 300}]},
{"cityId": 211, "regionId": 211, 'data':[{'code': 'XYZ', 'date': '2023-11-11 02:00', 'value': 300}, {'code': 'XYZ', 'date': '2023-11-12 02:00', 'value': 300}]}]
df = pandas.DataFrame(data=d)
new_df = df.explode('data')['data']
new_df = json_normalize(new_df)
我目前的输出:
cityId regionId data
0 111 111 [{'code': 'ABC', 'date': '2023-11-11 02:00', '...
1 211 211 [{'code': 'XYZ', 'date': '2023-11-11 02:00', '...
code date value
0 ABC 2023-11-11 02:00 300
1 ABC 2023-11-12 02:00 300
2 XYZ 2023-11-11 02:00 300
3 XYZ 2023-11-12 02:00 300
我想要的输出:
code date value cityId regionId
0 ABC 2023-11-11 02:00 300 111 111
1 ABC 2023-11-12 02:00 300 111 111
2 XYZ 2023-11-11 02:00 300 211 211
3 XYZ 2023-11-12 02:00 300 211 211
我想我应该加入或合并,但是当我尝试这些时,我会乘以列。 我已经用环完成了这项工作,但我被要求使我的电线更短。
答:
0赞
Andrej Kesely
11/11/2023
#1
尝试:
d = [
{
"cityId": 111,
"regionId": 111,
"data": [
{"code": "ABC", "date": "2023-11-11 02:00", "value": 300},
{"code": "ABC", "date": "2023-11-12 02:00", "value": 300},
],
},
{
"cityId": 211,
"regionId": 211,
"data": [
{"code": "XYZ", "date": "2023-11-11 02:00", "value": 300},
{"code": "XYZ", "date": "2023-11-12 02:00", "value": 300},
],
},
]
df = pd.DataFrame(data=d)
df = df.explode("data")
df = pd.concat([df, df.pop("data").apply(pd.Series)], axis=1).reset_index(drop=True)
print(df)
指纹:
cityId regionId code date value
0 111 111 ABC 2023-11-11 02:00 300
1 111 111 ABC 2023-11-12 02:00 300
2 211 211 XYZ 2023-11-11 02:00 300
3 211 211 XYZ 2023-11-12 02:00 300
评论
1赞
KurczakChrupiacy2
11/11/2023
非常感谢你,我想我错过了这个reset_index这是关键
1赞
Timeless
11/11/2023
#2
由于您进行了规范化
,因此您可以传递参数以添加 2 个缺失的列:meta
import pandas as pd
df = pd.json_normalize(d, "data", meta=["cityId", "regionId"])
输出:
print(df)
code date value cityId regionId
0 ABC 2023-11-11 02:00 300 111 111
1 ABC 2023-11-12 02:00 300 111 111
2 XYZ 2023-11-11 02:00 300 211 211
3 XYZ 2023-11-12 02:00 300 211 211
[4 rows x 5 columns]
评论
1赞
KurczakChrupiacy2
11/11/2023
谢谢,您在一行代码:)中解决了整个问题!
上一个:根据另一列中的条件填写列中的值
下一个:啤酒研究的嵌套词典
评论