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

按层级和年份向DataFrame有序添加行的实现方法

解决方案:按年份逐层构建公司层级数据集

方法一:使用Python Pandas迭代构建层级

假设全量数据集为full_data(含id、parent_id、year字段),母公司数据集为parent_companies(含id、year字段),步骤如下:

  1. 初始化结果集,标记母公司为0层级:
import pandas as pd

# 复制母公司数据并添加层级标识
result = parent_companies.copy()
result['level'] = 0
  1. 循环迭代抓取各层级下属公司,直到无新数据加入:
current_level = 0
while True:
    # 提取当前层级所有公司的ID和对应年份
    current_nodes = result[result['level'] == current_level][['id', 'year']]
    
    # 关联全量数据,匹配同一年份下的直接子公司
    next_level = pd.merge(
        current_nodes,
        full_data,
        left_on=['id', 'year'],
        right_on=['parent_id', 'year'],
        how='inner'
    )[['id_y', 'parent_id', 'year']].rename(columns={'id_y': 'id'})
    
    # 去重,避免同一公司同一年份重复录入
    next_level = next_level.drop_duplicates(subset=['id', 'year'])
    
    # 无新数据则终止循环
    if next_level.empty:
        break
    
    # 标记新层级并合并到结果集
    next_level['level'] = current_level + 1
    result = pd.concat([result, next_level], ignore_index=True)
    
    current_level += 1

最终result即为包含所有层级、按年份划分的完整公司数据集。

方法二:使用SQL递归查询(数据库场景)

如果数据存储在数据库中,可通过递归CTE实现(以PostgreSQL为例):

WITH RECURSIVE company_hierarchy AS (
    -- 初始数据集:母公司,层级为0
    SELECT 
        id, 
        parent_id, 
        year, 
        0 AS level
    FROM parent_companies
    
    UNION ALL
    
    -- 递归关联:抓取同一年份下的子公司,层级+1
    SELECT 
        f.id, 
        f.parent_id, 
        f.year, 
        ch.level + 1 AS level
    FROM full_data f
    JOIN company_hierarchy ch 
        ON f.parent_id = ch.id 
        AND f.year = ch.year
    -- 避免循环关联导致死递归
    WHERE f.id != f.parent_id
)
SELECT * FROM company_hierarchy ORDER BY year, level, id;

关键注意事项

  • 年份严格匹配:所有层级关联必须绑定year字段,确保每年的层级结构独立计算。
  • 去重处理:全量数据可能存在重复的公司-年份记录,需通过drop_duplicates(Pandas)或DISTINCT(SQL)去重。
  • 循环检测:若数据存在循环关联(如A的母公司是B,B的母公司是A),需添加判断条件避免死循环。

内容的提问来源于stack exchange,提问作者Jesus Garcia

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 00:56:06