Pandas 在 Dataframe 中处理字典

Pandas handling Dictionary inside Dataframe

提问人:KurczakChrupiacy2 提问时间:11/11/2023 更新时间:11/11/2023 访问量:51

问:

我的代码:

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

我想我应该加入或合并,但是当我尝试这些时,我会乘以列。 我已经用环完成了这项工作,但我被要求使我的电线更短。

Python Pandas 数据帧 字典

评论


答:

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
谢谢,您在一行代码:)中解决了整个问题!