Pandas在DataFrame中处理字典

3
我的代码:
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

我想我应该使用join或merge,但是当我尝试这些方法时,会导致列数增加。 我已经用循环完成了这个任务,但被要求让我的代码更简洁。
2个回答

1
由于您已经进行了规范化,您可以传递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
谢谢,你用一行代码解决了整个问题!:) - undefined

0

尝试:

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
非常感谢,我觉得我漏掉了这个关键的reset_index - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接