You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于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_

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 23:32:07