使用Pandas将嵌套JSON转为DataFrame时如何避免拆分嵌套键生成重复行
核心问题根因
pd.DataFrame.from_dict 默认接收顶层字典入参时,会递归遍历内部的嵌套字典/列表结构,把嵌套结构的子键自动识别为独立的行/列维度,最终导致非嵌套的企业基础字段被重复复制,生成和嵌套子键数量匹配的冗余行。要实现“单行完整存储、嵌套字段不展开”的目标,核心是打破pandas对嵌套结构的自动递归解析逻辑。
实操解决方案
方案一:单行列表封装(稳定性最高的写法)
将需要转换的General字段完整字典作为唯一元素放入列表,再传入pandas构造函数,从根源上规避嵌套展开逻辑:
import pandas as pd import json # 示例:接口返回的General字段结构 general_resp = { "ent_name": "示例企业", "credit_code": "91310115MA1KXXXX", "AddressData": {"province": "上海市", "city": "上海市", "addr": "浦东新区xx路"}, "Listings": [{"board": "科创板", "stock_code": "688XXX"}], "Officers": [{"name": "张三", "title": "董事长"}] } # 核心转换操作:单字典包为列表元素,向pandas传递单行数据信号 df = pd.DataFrame([general_resp]) # 对三个嵌套字段做JSON序列化,确保单元格内存储为可直接复用的JSON格式 for nested_col in ["AddressData", "Listings", "Officers"]: df[nested_col] = df[nested_col].apply( lambda x: json.dumps(x, ensure_ascii=False) )
核心效果:生成的DataFrame仅包含1行数据,所有扁平字段为对应标量值,三个嵌套字段以完整JSON字符串形式存在单元格中,无冗余重复行。
方案二:from_dict定向参数适配
如果必须使用pd.DataFrame.from_dict方法完成转换,可通过指定索引方向搭配转置的方式,避免递归展开:
# 以字段名作为行索引构造单序列结构,再转置为单行DataFrame df = pd.DataFrame.from_dict(general_resp, orient="index").T # 后续嵌套字段序列化逻辑和方案一完全一致 for nested_col in ["AddressData", "Listings", "Officers"]: df[nested_col] = df[nested_col].apply( lambda x: json.dumps(x, ensure_ascii=False) )
踩坑注意事项
- 不要直接将单个
General字典传入pd.DataFrame(general_resp)或不带参数的pd.DataFrame.from_dict(general_resp),这两种写法都会触发pandas的嵌套结构自动解析,生成冗余行 - 嵌套字段序列化时必须添加
ensure_ascii=False参数,否则中文内容会被转义为Unicode编码,无法直接读取使用 - 如果后续需要将DataFrame写入关系型数据库、导出为Excel/CSV格式,必须对嵌套字段做JSON序列化,避免Python原生字典/列表对象引发的类型兼容报错
内容的提问来源于stack exchange,提问作者Lostsoul
相关产品推荐
相关产品推荐

