如何将两列pandas DataFrame转换为多级分层的多列结构?
问题解答
pandas本身没有针对这种上下游从属关系转多级层级表的内置专门方法,但你完全不需要自己手写递归实现,两种更简便的实现方案如下:
方案1:借助networkx实现(适配灵活场景)
适合层级不固定、结构复杂的从属关系,代码逻辑极简:
- 核心思路是把两列的从属关系转为有向图,直接调用图计算库的路径查询能力获取全链路层级
import pandas as pd import networkx as nx # 替换为你自己的DataFrame即可 df = pd.DataFrame({ 'From': ['A', 'A', 'B', 'B', 'C'], 'To': ['B', 'C', 'D', 'E', 'F'] }) # 1. 构建有向图 G = nx.from_pandas_edgelist(df, source='From', target='To', create_using=nx.DiGraph) # 2. 找到所有最高层级的根节点(入度为0,没有上游节点) roots = [n for n, d in G.in_degree() if d == 0] all_paths = [] for root in roots: # 3. 遍历所有根到叶子的路径,cutoff=3表示最多取4个节点的路径,刚好对应Level_1到Level_4 for path in nx.all_simple_paths(G, source=root, target=lambda x: G.out_degree(x) == 0, cutoff=3): all_paths.append(path) # 4. 转成要求的层级表结构 level_df = pd.DataFrame(all_paths, columns=[f'Level_{i+1}' for i in range(4)])
方案2:纯pandas迭代实现(无第三方依赖)
适合层级固定的场景,你需要4级层级表只需要迭代3次即可:
# 1. 初始化第一级节点(根节点) level_df = pd.DataFrame({'Level_1': df.loc[~df['From'].isin(df['To']), 'From'].unique()}) # 2. 迭代合并3次,依次生成Level_2到Level_4 for i in range(3): current_level = f'Level_{i+1}' next_level = f'Level_{i+2}' level_df = level_df.merge(df, left_on=current_level, right_on='From', how='left')\ .rename(columns={'To': next_level})\ .drop(columns=['From']) # 3. 去重得到最终结果 level_df = level_df.drop_duplicates().reset_index(drop=True)
注意:两种方法都默认你的从属关系是无循环的有向结构,如果数据存在循环依赖,需要先做数据清洗过滤循环链路,避免遍历出错。
内容的提问来源于stack exchange,提问作者seb5ferrari
相关产品推荐
相关产品推荐

