You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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结构如下:

groupnamegroupidcity
grp11London
grp22NewYork

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行样例如下:

idnameagegendergroupid
0john12M1
1maat15M1
2chrissle10F1

原有写法的优化提示

iterrows() + 逐行append()的实现方式运行效率极低,数据量较大时性能会非常差,官方也已经明确将DataFrame.append()方法标记为弃用,建议替换为上面的批量拼接方案。

内容的提问来源于stack exchange,提问作者kanataki

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 11:48:51