如何将Python嵌套字典转换为Pandas非平衡面板数据
嵌套字典转非平衡面板数据解决方案
示例输入结构
假设你的嵌套字典结构如下(模拟个人就业历史数据):
employment_data = [ { "person_id": 101, "name": "张三", "jobs": [ {"year": 2020, "city": "北京", "company": "A公司"}, {"year": 2021, "city": "上海", "company": "B公司"}, {"year": 2023, "city": "广州", "company": "C公司"} ] }, { "person_id": 102, "name": "李四", "jobs": [ {"year": 2019, "city": "深圳", "company": "D公司"}, {"year": 2022, "city": "杭州", "company": "E公司"} ] } ]
目标非平衡面板数据样式
最终要生成的面板数据如下(每人对应多行就业记录):
| person_id | name | year | city | company |
|---|---|---|---|---|
| 101 | 张三 | 2020 | 北京 | A公司 |
| 101 | 张三 | 2021 | 上海 | B公司 |
| 101 | 张三 | 2023 | 广州 | C公司 |
| 102 | 李四 | 2019 | 深圳 | D公司 |
| 102 | 李四 | 2022 | 杭州 | E公司 |
解决方案
方法一:手动遍历构建(逻辑清晰,适合新手)
直接遍历嵌套结构,把每条就业记录拆成单独行,再转成DataFrame:
import pandas as pd panel_rows = [] for person in employment_data: # 提取个人基础信息 base_info = {"person_id": person["person_id"], "name": person["name"]} # 遍历每份工作经历,拼接基础信息与就业详情 for job in person["jobs"]: panel_rows.append({**base_info, **job}) panel_df = pd.DataFrame(panel_rows)
方法二:Pandas组合工具(高效处理复杂嵌套)
结合explode拆分列表,再用json_normalize展开嵌套字典,适合大规模数据:
import pandas as pd # 外层数据转DataFrame df = pd.DataFrame(employment_data) # 把jobs列表拆分成多行 df_exploded = df.explode("jobs", ignore_index=True) # 展开jobs列中的嵌套字典,与原数据合并 panel_df = pd.concat( [df_exploded.drop("jobs", axis=1), pd.json_normalize(df_exploded["jobs"])], axis=1 )
关键说明
之前单独用json_normalize失败,是因为它默认只处理第一层嵌套,而jobs是列表结构,必须先用explode把列表拆成每行,再展开里面的字典字段。
内容的提问来源于stack exchange,提问作者SChatcha
相关产品推荐
相关产品推荐

