如何将N层嵌套字典转换为分层Pandas DataFrame?
解决N层嵌套字典转指定结构Pandas DataFrame的问题
核心思路
先通过递归遍历把嵌套字典展平成「路径-值」的列表,再将路径拆分为level_0和level_1列,最后转换为目标DataFrame。
具体实现代码
1. 导入依赖库
import pandas as pd import numpy as np
2. 递归展平嵌套字典
写一个递归函数,遍历所有层级的键值对,将嵌套路径用分隔符(比如.)拼接,生成扁平化的路径-值列表:
def flatten_nested_dict(d, parent_path="", sep="."): items = [] for key, value in d.items(): # 拼接当前层级的路径 current_path = f"{parent_path}{sep}{key}" if parent_path else key # 如果当前值还是字典,继续递归遍历 if isinstance(value, dict): items.extend(flatten_nested_dict(value, current_path, sep=sep)) # 如果是叶子节点(非字典值),添加到结果列表 else: items.append((current_path, value)) return items
3. 转换为目标DataFrame
以示例嵌套字典为例,执行以下步骤:
# 示例输入的嵌套字典 input_dict = { "X": 10, "Y": {"Y1": 20, "Y2": {"Y2a": 30, "Y2b": 40}}, "Z": {"Z1": {"Z1a": {"Z1a1": 50}}} } # 展平字典 flattened_list = flatten_nested_dict(input_dict) # 转为临时DataFrame,包含路径和值两列 temp_df = pd.DataFrame(flattened_list, columns=["path", "value"]) # 拆分路径为level_0(顶层键)和level_1(剩余路径部分) temp_df[["level_0", "level_1"]] = temp_df["path"].str.split(".", n=1, expand=True) # 调整列顺序,替换空值为NaN,删除临时path列 result_df = temp_df[["level_0", "level_1", "value"]] result_df["level_1"] = result_df["level_1"].replace("", np.nan) # 查看结果 print(result_df)
输出结果
level_0 level_1 value 0 X NaN 10 1 Y Y1 20 2 Y Y2.Y2a 30 3 Y Y2.Y2b 40 4 Z Z1.Z1a.Z1a1 50
自定义调整说明
如果需要调整level_1的格式(比如只保留最后一级父键,而非完整路径),可以修改路径拆分逻辑:
def split_path_custom(path): parts = path.split(".") if len(parts) == 1: return parts[0], np.nan # 取顶层键作为level_0,中间所有层级拼接为level_1 return parts[0], ".".join(parts[1:-1]) if len(parts) > 2 else parts[1] # 应用自定义拆分函数 temp_df[["level_0", "level_1"]] = temp_df["path"].apply(lambda x: pd.Series(split_path_custom(x)))
修改后的输出会变为:
level_0 level_1 value 0 X NaN 10 1 Y Y1 20 2 Y Y2 30 3 Y Y2 40 4 Z Z1a 50
内容的提问来源于stack exchange,提问作者nuri
相关产品推荐
相关产品推荐

