Python:根据嵌套路径字符串动态生成DataFrame列的方案问询
解决嵌套JSON变更路径的分层DataFrame展示问题
问题核心
你当前通过固定位置的字符串切片提取DeepDiff返回的路径字段,仅能处理特定层级的嵌套结构,无法适配不同深度的JSON变更路径,需要实现动态解析路径层级、自动生成对应分层列的DataFrame,完成变更字段的分层展示。
解决方案
核心思路是先通用解析路径字符串提取所有嵌套层级的字段名,再根据所有路径的最大深度动态生成列名,最后构造统一结构的DataFrame。
1. 路径解析优化
用正则表达式替代固定位置切片,可适配任意嵌套深度的路径提取:
import re def parse_deepdiff_path(path_str): # 匹配所有['xxx']格式的字段名并提取 return re.findall(r"\['(.*?)'\]", path_str) # 测试示例 k = """root['prod1']['p_col']['c_col']""" path_parts = parse_deepdiff_path(k) # 输出结果: ['prod1', 'p_col', 'c_col']
2. 动态生成分层列并构造DataFrame
先收集所有变更记录的路径,确定最大嵌套深度,再生成对应列名,最后填充数据:
import pandas as pd # 模拟DeepDiff返回的变更记录(包含不同嵌套深度) change_records = [ {"path": """root['prod1']['p_col']['c_col']""", "old_value": 10, "new_value": 20}, {"path": """root['prod2']['price']""", "old_value": 50, "new_value": 55}, {"path": """root['prod3']['attr']['size']['width']""", "old_value": 100, "new_value": 120} ] # 解析所有路径并获取最大嵌套深度 parsed_paths = [parse_deepdiff_path(rec['path']) for rec in change_records] max_depth = max(len(parts) for parts in parsed_paths) # 生成分层列名:第一层为product,第二层为parent-field,后续为fieldN column_names = [] if max_depth >= 1: column_names.append("product") if max_depth >= 2: column_names.append("parent-field") if max_depth >= 3: column_names.extend([f"field{i}" for i in range(1, max_depth - 1 + 1)]) # 追加变更值列 column_names.extend(["old_value", "new_value"]) # 构造DataFrame数据行 data_rows = [] for rec, parts in zip(change_records, parsed_paths): row = list(parts) # 对不足最大深度的层级填充空值,保证结构统一 row += [None] * (max_depth - len(row)) row.extend([rec['old_value'], rec['new_value']]) data_rows.append(row) # 生成最终DataFrame df = pd.DataFrame(data_rows, columns=column_names) print(df)
输出结果
product parent-field field1 field2 old_value new_value 0 prod1 p_col c_col None 10 20 1 prod2 None None None 50 55 2 prod3 attr size width 100 120
关键说明
- 正则解析方法彻底解决了固定切片无法适配多层级嵌套的问题;
- 动态列名基于所有路径的最大深度生成,确保所有层级的变更字段都能分层展示;
- 空值填充保证了DataFrame结构的统一性,便于后续分析处理。
内容的提问来源于stack exchange,提问作者Kavya shree
相关产品推荐
相关产品推荐

