如何在Pandas中展开DataFrame内字典并关联原有列?
解决Pandas嵌套字典列表拆分后保留原列的简洁方法
直接上干货,用explode+json_normalize+concat的组合就能搞定,不用循环,代码简洁还高效:
步骤拆解(附示例)
假设你的原始DataFrame长这样:
import pandas as pd df = pd.DataFrame({ 'cityId': ['C001', 'C002'], 'regionId': ['R001', 'R002'], 'data': [ [{'code': 'A', 'date': '2023-01-01', 'value': 10}, {'code': 'B', 'date': '2023-01-02', 'value': 20}], [{'code': 'C', 'date': '2023-01-03', 'value': 30}] ] })
- 拆分data列的列表:用
explode把每个字典拆成单独一行,此时cityId和regionId会自动对应到每一行:
df_exploded = df.explode('data').reset_index(drop=True)
- 解析字典列:用
json_normalize把data列的字典转成结构化的列:
df_parsed = pd.json_normalize(df_exploded['data'])
- 拼接原列和解析后的列:因为两者索引完全对齐,直接用
pd.concat横向拼接就行:
final_df = pd.concat([df_exploded[['cityId', 'regionId']], df_parsed], axis=1)
为啥之前join/merge会重复?
大概率是你没处理索引,或者merge时没指定唯一键导致匹配混乱。而concat依赖索引对齐,只要df_exploded和df_parsed的索引一致,就不会出现重复列或匹配错误的问题。
更简洁的写法(一行搞定)
如果想省行数,可以把步骤合并:
final_df = df.explode('data').pipe(lambda x: pd.concat([x[['cityId', 'regionId']], pd.json_normalize(x['data'])], axis=1))
内容的提问来源于stack exchange,提问作者KurczakChrupiacy2
相关产品推荐
相关产品推荐

