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

如何展开包含树状层级结构的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.03 07:21:55