按层级和年份向DataFrame有序添加行的实现方法
解决方案:按年份逐层构建公司层级数据集
方法一:使用Python Pandas迭代构建层级
假设全量数据集为full_data(含id、parent_id、year字段),母公司数据集为parent_companies(含id、year字段),步骤如下:
- 初始化结果集,标记母公司为0层级:
import pandas as pd # 复制母公司数据并添加层级标识 result = parent_companies.copy() result['level'] = 0
- 循环迭代抓取各层级下属公司,直到无新数据加入:
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
相关产品推荐
相关产品推荐

