
本文介绍如何使用列表推导式与字典推导式,一步将含嵌套结构的 JSON(如 {"results": [{"values": [...]}]})转换为结构清晰、列名自动提取的 Pandas DataFrame,避免显式循环和硬编码字段名。
本文介绍如何使用列表推导式与字典推导式,一步将含嵌套结构的 json(如 `{"results": [{"values": [...]}]}`)转换为结构清晰、列名自动提取的 pandas dataframe,避免显式循环和硬编码字段名。
在处理 API 返回的 JSON 数据时,常遇到类似如下嵌套结构:外层是结果列表("results"),每项包含一个 "values" 数组,数组内每个对象以 "name" 和 "value" 键描述字段名与对应值。目标是将其扁平化为标准二维表格——即 Pandas DataFrame,其中列名为 "name" 的值(如 "firstname"),行为各记录的实际 "value"。
最简洁、Pythonic 的解决方案是嵌套推导式 + DataFrame 构造器:
import pandas as pd
data = {
"results": [
{"values": [{"name": "firstname","value": "Fname1"},{"name": "lastname","value": "Lname1"}]},
{"values": [{"name": "firstname","value": "Fname2"},{"name": "lastname","value": "Lname2"}]},
{"values": [{"name": "firstname","value": "Fname3"},{"name": "lastname","value": "Lname3"}]}
]
}
# 一行核心代码:生成字典列表,再构造 DataFrame
df = pd.DataFrame([
{item["name"]: item["value"] for item in record["values"]}
for record in data["results"]
])
print(df)
输出:
firstname lastname 0 Fname1 Lname1 1 Fname2 Lname2 2 Fname3 Lname3
✅ 原理说明:
- 内层推导式 {item["name"]: item["value"] for item in record["values"]} 对每条记录的 values 数组遍历,动态构建键值对字典(如 {"firstname": "Fname1", "lastname": "Lname1"});
- 外层推导式 [... for record in data["results"]] 将所有此类字典收集为列表;
- pd.DataFrame(...) 自动识别字典列表中的一致键,并将其转为列名,值自动对齐为行数据。
⚠️ 注意事项:
- 若 values 中字段顺序不固定或存在缺失字段,建议确保所有记录包含相同 name(否则缺失值将自动填充为 NaN);
- 如需处理异常(如某条记录无 "values" 或 name/value 缺失),可加入 try/except 或使用 .get() 方法:item.get("name");
- 此方法天然支持任意数量的字段(如新增 "email" 字段无需修改代码),具备良好扩展性。
总结:相比手动循环或多次 apply 操作,嵌套推导式不仅代码更短、可读性更高,且性能优异——它充分利用了 Pandas 的向量化构造机制,是处理此类嵌套 JSON 到表格转换任务的推荐实践。










