从三层嵌套字典构造Pandas DataFrame:解决数据丢失问题
嵌套字典转结构化DataFrame的问题
我有一个三层嵌套字典,最底层是字典与值的混合结构,想要转换成以最底层键为列名、第一层键为ID的DataFrame。示例字典如下:
my_dict = { "id1": { "att_1": 1, "att_2": { "att2_1": "value1", "att2_2": "value2" } }, "id2": { "att_1": 2, "att_2": { "att2_1": "value3", "att2_2": "value4" } } }
我尝试用pandas.DataFrame.from_dict()写了这段代码:
import pandas as pd pd.DataFrame.from_dict({(i): my_dict[i][j] for i in my_dict.keys() for j in my_dict[i].keys()}, orient='index')
但输出结果丢失了第二层的att_1数据,得到的结果是:
att2_1 att2_2 id1 value1 value2 id2 value3 value4
请问怎么修复这个问题,或者有没有更优的实现方式?
解决方法
方法一:修复原代码的扁平化逻辑
你的字典推导式只提取了第二层中是字典的att_2,直接把att_1的值丢弃了。需要先把每个ID对应的所有底层键值对展开成单层字典,再构建DataFrame。
可以写一个简单的扁平化函数处理嵌套结构:
def flatten_dict(d, parent_key='', sep='_'): items = [] for k, v in d.items(): new_key = f"{parent_key}{sep}{k}" if parent_key else k if isinstance(v, dict): items.extend(flatten_dict(v, new_key, sep=sep).items()) else: items.append((new_key, v)) return dict(items) # 对每个ID对应的字典做扁平化处理 flat_data = {id_val: flatten_dict(data) for id_val, data in my_dict.items()} # 转成DataFrame df = pd.DataFrame.from_dict(flat_data, orient='index')
执行后得到的目标结果:
att_1 att2_1 att2_2 id1 1 value1 value2 id2 2 value3 value4
方法二:用pd.json_normalize(更简洁高效)
Pandas内置的json_normalize可以直接处理这种嵌套结构,无需手动写扁平化函数,一步到位:
import pandas as pd # 把原字典转成包含ID的列表格式 data_list = [{"id": id_val, **data} for id_val, data in my_dict.items()] # 解析嵌套结构并设置ID为索引 df = pd.json_normalize(data_list).set_index('id')
输出结果和方法一完全一致,代码更简洁,适合处理各种复杂嵌套的字典结构。
内容的提问来源于stack exchange,提问作者Nils Lang
相关产品推荐
相关产品推荐

