如何用Python标准化JSON文件的Teachers列表,无需指定Tid、Tname字段?
问题描述
示例文件:sample.json
{ "school":[ { "testId":123, "testName":"test1", "Teachers":[ { "Tid":111, "Tname":"aaa" }, { "Tid":222, "Tname":"bbb" }, { "Tid":333, "Tname":"ccc" }, { "Tid":444, "Tname":"ddd" } ], "location":"India" } ] }
现有代码
import json import pandas as pd with open('sample.json', 'r') as f: data = json.load(f) df = pd.json_normalize(data, record_path='school', max_level=1) df.to_csv("out.csv",index=False)
当前输出
当前生成的CSV里,Teachers列是一整串嵌套的JSON列表,其他列是testId、testName、location的单值内容,没有把教师信息展开成单独行。
期望输出
希望把每个教师的信息单独占一行,同时保留学校相关的字段,最终格式如下:
| testId | testName | location | Tid | Tname |
|---|---|---|---|---|
| 123 | test1 | India | 111 | aaa |
| 123 | test1 | India | 222 | bbb |
| 123 | test1 | India | 333 | ccc |
| 123 | test1 | India | 444 | ddd |
关键要求:不需要手动传入"Tid"和"Tname"这类字段名,实现自动展开。
提问
能不能做到不指定"Tid"和"Tname"的前提下,得到上述期望的输出?
解决方案
可以实现,而且完全不需要硬编码任何字段名(包括教师和学校层级的字段),代码如下:
import json import pandas as pd with open('sample.json', 'r') as f: data = json.load(f) # 自动获取学校层级除Teachers外的所有字段 school_fields = [key for key in data['school'][0].keys() if key != 'Teachers'] # 转换为json_normalize需要的meta路径格式 meta_paths = [['school', field] for field in school_fields] # 展开Teachers列表,同时关联学校层级的所有字段 df = pd.json_normalize( data, record_path=['school', 'Teachers'], meta=meta_paths ) # 清理列名,去掉自动生成的"school."前缀 df.columns = [col.split('.')[-1] for col in df.columns] df.to_csv("out.csv", index=False)
代码说明
- 自动识别字段:通过遍历
school下的第一个对象,排除Teachers后得到所有学校字段,避免硬编码; - 正确展开嵌套:
record_path直接定位到Teachers列表,将每个教师对象拆成单独行; - 关联上层字段:
meta参数自动把学校字段的值对应到每一行教师记录; - 列名清理:把
json_normalize自动生成的school.testId这类列名简化成testId,符合期望格式。
内容的提问来源于stack exchange,提问作者Aks3
相关产品推荐
相关产品推荐

