如何优化多层Children数据合并至DataFrame的函数?
优化JSON层级children合并到DataFrame的递归方案
嘿,我懂你现在的困扰——手动写每一层的json_normalize不仅重复得让人头疼,要是哪天JSON的层级变深或者结构调整,这段代码直接就失效了。咱们换个思路,用递归遍历的方式来处理这种嵌套的children结构,不管有多少层都能自动适配,这才是可复用的优雅方案。
核心思路
递归的本质就是“自己调用自己”:我们从最顶层的节点开始,收集每个节点的非children字段数据,然后对每个节点的children做同样的操作,直到遍历完所有层级的节点,最后把所有收集到的节点数据转换成DataFrame。
实现代码
import pandas as pd def flatten_children(node, parent_info=None): # 初始化当前节点的信息,继承父节点的字段(如果需要保留父层级信息的话) current_info = parent_info.copy() if parent_info else {} # 把当前节点的非children字段加入到当前信息中 current_info.update({key: value for key, value in node.items() if key != "children"}) # 先把当前节点加入结果列表 result = [current_info] # 如果当前节点有children,递归处理每个子节点 if "children" in node and node["children"]: for child in node["children"]: result.extend(flatten_children(child, current_info)) return result def get_combined_dataframe(catMapping): # 从JSON的根children节点开始遍历 root_nodes = catMapping["SuccessResponse"]["Body"]["children"] all_nodes = [] # 处理每个根节点及其子节点 for root in root_nodes: all_nodes.extend(flatten_children(root)) # 把所有节点数据转换成DataFrame return pd.DataFrame(all_nodes)
代码说明
flatten_children函数:负责递归遍历单个节点及其所有子节点。它会把当前节点的非children字段收集起来,然后递归处理每个子节点,把子节点的结果合并到当前结果列表中。如果需要保留父层级的信息(比如父分类ID、父分类名称),parent_info参数会自动把父节点的字段传递给子节点,最终的DataFrame里每个子节点都会带上所有上层父节点的信息。get_combined_dataframe函数:作为入口函数,从你的JSON结构的根children节点开始,遍历每个根节点,调用递归函数收集所有节点数据,最后转换成DataFrame返回。
优势对比
- 相比你之前手动分层的方案,这个递归方案完全自适应层级深度——不管是3层还是10层,代码都不需要修改。
- 代码更简洁易维护,逻辑清晰,不会出现像你原来代码里那种重复的
json_normalize调用。 - 天然支持保留父层级信息,这是手动分层很难做到的(除非你手动给每一层加父字段)。
内容的提问来源于stack exchange,提问作者AnalyticsPy
相关产品推荐
相关产品推荐

