如何展开包含树状层级结构的Pandas DataFrame
树状类DataFrame完全展开方案
核心逻辑是通过递归替换的方式,逐层将Sub-class为类名的行替换为对应类的定义,直到所有Sub-class取值仅为数值或空值。
实现步骤
- 基于原始df1按
Class列分组,构建类名到对应定义行的映射字典,无需手动维护每个类的定义 - 编写递归展开函数逐行校验:
- 若当前行
Sub-class是已定义的类名,取出该类的所有定义行递归展开后替换当前行 - 若当前行
Sub-class是数值或空值(即Type为P的终止行),直接保留
- 若当前行
- 拼接所有处理完成的行得到最终结果
可直接运行的代码
import pandas as pd import numpy as np # 构造示例原始数据df1 data = [ [1, '~', 'D'], [1, '~', 'C'], [1, '~', 'B'], [1, '~', 'A'], [1, '~', '14'], [1, 'P', np.nan], ['A', '~', 'C'], ['A', '~', 'D'], ['A', '~', '7'], ['A', '~', 'B'], ['A', 'P', np.nan], ['B', '~', 'D'], ['B', '~', '4'], ['B', '~', 'C'], ['B', 'P', np.nan], ['C', '~', 'D'], ['C', '~', '4'], ['C', 'P', np.nan], ['D', '~', '18'], ['D', '~', '9'], ['D', 'P', np.nan] ] df1 = pd.DataFrame(data, columns=['Class', 'Type', 'Sub-class']) # 构建类定义映射:key为类名,value为该类对应的所有定义行 class_map = {cls: group.reset_index(drop=True) for cls, group in df1.groupby('Class')} def expand_df(input_df): processed_rows = [] for _, row in input_df.iterrows(): sub_cls = row['Sub-class'] # 满足非空、且属于已定义类时,递归展开替换 if pd.notna(sub_cls) and sub_cls in class_map: processed_rows.append(expand_df(class_map[sub_cls])) # 无需展开的行直接保留 else: processed_rows.append(pd.DataFrame([row])) return pd.concat(processed_rows, ignore_index=True) # 执行展开得到最终结果 df_final = expand_df(df1) print(df_final)
结果说明
运行代码后输出的df_final中,Sub-class列将不存在A/B/C/D/1这类类名字段,仅保留数值类取值和终止行的空值,完全符合展开要求。如果类的层级有新增或调整,只要更新原始df1的内容即可,不需要修改展开逻辑。
内容的提问来源于stack exchange,提问作者star_it8293
相关产品推荐
相关产品推荐

