Python pandas提取嵌套列表时如何将id字段添加到DataFrame每行
问题说明
开发Python应用时从数据库检索得到名为tbl的列表,为嵌套字典结构,样例格式如下:
[ { "id": "rec2fiwnTQewTv9HC", "createdTime": "2022-06-27T08:25:47.000Z", "fields": { "Num": 19, "latitude": 31.101405, "longitude": 36.391831, "State": 2, "Label": "xyz", "Red": 0, "Green": 255, "Blue": 0 } }, { "id": "rec4y7vhgZVDHrhrQ", "createdTime": "2022-06-27T08:25:47.000Z", "fields": { "Num": 30, "latitude": 31.101405, "longitude": 36.391831, "State": 2, "Label": "abc", "Red": 0, "Green": 255, "Blue": 0 } } ]
原有实现仅能提取嵌套结构fields中的值生成DataFrame,代码如下:
pd.DataFrame([d['fields'] for d in tbl])
需求是将每条记录顶层的id字段同步添加到生成的DataFrame对应行中。
实现方案
方案1:遍历合并字典(轻量场景推荐)
在列表推导式生成行数据时,手动将顶层id和fields下的字段合并为同一个字典即可,利用Python字典解包语法写法非常简洁:
import pandas as pd df = pd.DataFrame([ {"id": d["id"], **d["fields"]} for d in tbl ])
如果后续需要同时保留顶层的createdTime等其他字段,直接在字典中追加键值对即可,例如:
df = pd.DataFrame([ { "id": d["id"], "createdTime": d["createdTime"], **d["fields"] } for d in tbl ])
方案2:用pandas内置方法拍平嵌套结构(复杂嵌套场景推荐)
如果数据嵌套层级多、字段量大,不需要手动拼接字典,直接用pd.json_normalize自动拍平嵌套结构即可:
# 自动把所有层级的字段展开为列 df = pd.json_normalize(tbl)
该方法生成的列名会自动带层级前缀,例如fields.Num、fields.latitude,如果不需要前缀,可以通过列重命名清理:
df.columns = [col.replace("fields.", "") for col in df.columns] # 不需要createdTime字段的话直接删除即可 df = df.drop(columns=["createdTime"])
两种方案最终生成的DataFrame都会在每行保留对应记录的顶层id,同时包含fields下的所有业务字段,符合需求。
内容的提问来源于stack exchange,提问作者Gidil
相关产品推荐
相关产品推荐

