Pandas嵌套JSON转DataFrame保留section编号为列的实现方法
实现方案
注意:你提供的原始JSON存在重复顶级键group和persons,常规JSON解析器加载时会自动覆盖前一组同键数据,需先将原始数据调整为分组列表结构,格式参考如下:
[ { "group": { "groupname": "grp1", "groupid": 1, "city": "London" }, "persons": { "0": {"name": "john", "age": 12, "gender": "M", "groupid": 1}, "1": {"name": "maat", "age": 15, "gender": "M", "groupid": 1}, "2": {"name": "chrissle", "age": 10, "gender": "F", "groupid": 1}, "3": {"name": "stacy", "age": 11, "gender": "F", "groupid": 1}, "4": {"name": "mark", "age": 12, "gender": "M", "groupid": 1}, "5": {"name": "job", "age": 12, "gender": "M", "groupid": 1} } }, { "group": { "groupname": "grp2", "groupid": 2, "city": "NewYork" }, "persons": { "0": {"name": "will", "age": 12, "gender": "M", "groupid": 2}, "1": {"name": "phil", "age": 15, "gender": "M", "groupid": 2}, "2": {"name": "winnie", "age": 10, "gender": "F", "groupid": 2} } } ]
1. 提取group节点生成DataFrame
直接提取列表中每个元素的group字段传入构造方法即可,无需逐行循环:
import pandas as pd # 假设解析后的列表数据存储在raw_data变量中 group_df = pd.DataFrame([item["group"] for item in raw_data])
生成的group_df结构如下:
| groupname | groupid | city |
|---|---|---|
| grp1 | 1 | London |
| grp2 | 2 | NewYork |
2. 提取persons节点并保留原始序号为id列
原有写法丢失序号的核心原因是:转置后临时DataFrame的索引就是原始section序号,但拼接时使用ignore_index=True直接丢弃了原有索引,跨分组拼接时还会出现序号重复问题。
可以直接通过字典定向构造+批量拼接的方式实现,无需逐行迭代:
persons_df = pd.concat( [ pd.DataFrame.from_dict(item["persons"], orient="index") .rename_axis("id") .reset_index() for item in raw_data ], ignore_index=True ) # 将id列从字符串类型转为整数 persons_df["id"] = persons_df["id"].astype(int)
如果偏好显式遍历的写法,也可以直接提取键作为id字段:
person_records = [] for item in raw_data: for sec_id, info in item["persons"].items(): person_records.append({"id": int(sec_id), **info}) persons_df = pd.DataFrame(person_records)
最终生成的persons_df完全符合预期格式,前3行样例如下:
| id | name | age | gender | groupid |
|---|---|---|---|---|
| 0 | john | 12 | M | 1 |
| 1 | maat | 15 | M | 1 |
| 2 | chrissle | 10 | F | 1 |
原有写法的优化提示
iterrows() + 逐行append()的实现方式运行效率极低,数据量较大时性能会非常差,官方也已经明确将DataFrame.append()方法标记为弃用,建议替换为上面的批量拼接方案。
内容的提问来源于stack exchange,提问作者kanataki
相关产品推荐
相关产品推荐

