基于Pandas DataFrame实现母子公司关联数据转换的技术问询
母子公司关联数据树形结构转换方案建议

我有一张记录母子公司关联关系的企业数据表(如截图左侧表格),需要转换成截图右侧的表格结构,这得追踪两列数据,建立各记录间的关联。之前试过递归自连接表,但觉得用树结构(以最终母公司为根构建所有关联企业分支)更合理,对这类概念不太熟,求技术建议。
可复现输入代码:
import pandas as pd df = pd.DataFrame({'Subsidiary Company': ['Company B', 'Company C', 'Company D', 'Company 2', 'Company 3'], 'Parent Company': ['Company A', 'Company B', 'Company C', 'Company 1', 'Company 2']})
实操技术建议
1. 先构建树形映射关系
首先把数据转换成父子映射的字典,键是母公司,值是对应的子公司列表,这样能快速找到每个公司的下属企业。然后找出所有根节点——也就是没有上级母公司的企业(比如示例里的Company A、Company 1),这些就是每个分支的起点。
2. 递归遍历生成完整路径
从每个根节点出发,递归遍历它的所有子公司,把从根到叶子节点的完整路径记录下来。比如Company A → Company B → Company C → Company D,这就是一条完整的分支路径。
3. 转换为目标表格结构
把所有收集到的路径整理成表格,路径长度不足的用空值填充,就能得到类似截图右侧的层级化表格。
完整代码示例
import pandas as pd # 原始数据 df = pd.DataFrame({'Subsidiary Company': ['Company B', 'Company C', 'Company D', 'Company 2', 'Company 3'], 'Parent Company': ['Company A', 'Company B', 'Company C', 'Company 1', 'Company 2']}) # 构建父子映射字典 parent_child_map = {} for parent, sub in zip(df['Parent Company'], df['Subsidiary Company']): if parent not in parent_child_map: parent_child_map[parent] = [] parent_child_map[parent].append(sub) # 找出所有根节点(不在子公司列表里的母公司) all_subsidiaries = set(df['Subsidiary Company']) root_companies = [p for p in df['Parent Company'].unique() if p not in all_subsidiaries] # 递归生成所有完整路径 def build_full_paths(current_company, current_path): current_path.append(current_company) # 如果当前公司没有子公司,返回这条路径 if current_company not in parent_child_map: return [current_path.copy()] # 否则遍历所有子公司继续递归 all_paths = [] for child in parent_child_map[current_company]: all_paths.extend(build_full_paths(child, current_path)) current_path.pop() return all_paths # 收集所有分支路径 total_paths = [] for root in root_companies: total_paths.extend(build_full_paths(root, [])) # 转换成目标DataFrame max_level = max(len(path) for path in total_paths) # 生成层级列名 columns = [f"Level {i+1}" + (" (母公司)" if i == 0 else "") for i in range(max_level)] result_df = pd.DataFrame([path + [None]*(max_level - len(path)) for path in total_paths], columns=columns) print(result_df)
运行后输出:
Level 1 (母公司) Level 2 Level 3 0 Company A Company B Company C 1 Company A Company B Company C Company D 2 Company 1 Company 2 Company 3
为什么选树形结构而非递归自连接
树形结构的逻辑更直观,能一次性梳理所有层级关系,数据量大的时候比多次自连接效率更高,而且更容易维护和扩展——比如后续要增加更多层级,只需要调整递归逻辑即可,不用反复修改连接语句。
内容的提问来源于stack exchange,提问作者AW_
相关产品推荐
相关产品推荐

