如何规范化含列表与字典的深度嵌套JSON并生成目标DataFrame?
深度嵌套问卷JSON转扁平化DataFrame的最优方案
直接用pd.json_normalize的record_path和meta参数组合,就能一步实现完全扁平化,不需要额外的pivot或merge操作。
示例嵌套JSON结构
先模拟一份和需求匹配的问卷响应JSON:
sample_json = [ { "responseID": "RES123", "surveyID": "SURV456", "ipAddress": "192.168.1.1", "timestamp": "2024-05-20T10:00:00", "latitude": 40.7128, "longitude": -74.0060, "responseSet": [ { "questionText": "您对本次服务的满意度?", "answerValues": {"scale": 5, "text": "非常满意"} }, { "questionText": "您是否会推荐给他人?", "answerValues": {"scale": 4, "text": "可能会"} } ] }, { "responseID": "RES124", "surveyID": "SURV456", "ipAddress": "192.168.1.2", "timestamp": "2024-05-20T10:05:00", "latitude": 34.0522, "longitude": -118.2437, "responseSet": [ { "questionText": "您对本次服务的满意度?", "answerValues": {"scale": 3, "text": "一般"} } ] } ]
核心实现代码
import pandas as pd # 一步完成扁平化转换 df = pd.json_normalize( data=sample_json, record_path="responseSet", # 指定要展开的嵌套列表字段 meta=[ # 指定需要保留的顶层全局字段 "responseID", "surveyID", "ipAddress", "timestamp", "latitude", "longitude" ], sep="_" # 嵌套字段的分隔符,避免字段名冲突 )
代码说明
record_path="responseSet":直接将每个问卷的responseSet列表展开为多行,每个问题对应一条记录meta参数:自动将顶层的全局字段(如responseID、surveyID)复制到每一行,无需手动合并sep="_":将嵌套字段(如answerValues.scale)转换为answerValues_scale的格式,符合扁平化要求
最终输出效果
转换后的DataFrame会自动展开所有需要的字段:
| questionText | answerValues_scale | answerValues_text | responseID | surveyID | ipAddress | timestamp | latitude | longitude | |
|---|---|---|---|---|---|---|---|---|---|
| 0 | 您对本次服务的满意度? | 5 | 非常满意 | RES123 | SURV456 | 192.168.1.1 | 2024-05-20T10:00:00 | 40.7128 | -74.006 |
| 1 | 您是否会推荐给他人? | 4 | 可能会 | RES123 | SURV456 | 192.168.1.1 | 2024-05-20T10:00:00 | 40.7128 | -74.006 |
| 2 | 您对本次服务的满意度? | 3 | 一般 | RES124 | SURV456 | 192.168.1.2 | 2024-05-20T10:05:00 | 34.0522 | -118.2437 |
优势对比
相比之前用的record_path+pivot+merge方案,这个方法:
- 代码更简洁,一步到位
- 避免了中间数据处理步骤,效率更高
- 自动处理字段复制和嵌套展开,减少手动出错的可能
内容的提问来源于stack exchange,提问作者Irving Pérez
相关产品推荐
相关产品推荐

