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

如何为多级索引DataFrame添加.diff()计算的子列?

问题:为多层列DataFrame的每个顶级列新增差值子列

原始DataFrame结构:

First    Second
    A   B    A   B 
1   50  60   70  100
2   20  5    10  30
3   35  45   60  50

我希望用.diff()方法在每个顶级列下新增一个子列,基于该顶级列下的B列计算差值,最终效果如下:

目标DataFrame结构:

First          Second
    A   B   Diff     A    B    Diff
1   50  60  NaN      70   100  NaN
2   20  5   -55      10   30   -70
3   35  45  40       60   50   20 

我想找一种不用循环这类低效Python原生操作的简洁实现方式,不知道具体怎么做。

源DataFrame创建代码:

import pandas as pd

data = {
    ('First', 'A'): [50, 20, 35],
    ('First', 'B'): [60, 5, 45],
    ('Second', 'A'): [70, 10, 60],
    ('Second', 'B'): [100, 30, 50]
}
df = pd.DataFrame(data)

解决方案

可以利用pandas的多层列操作和矢量化方法实现,完全不需要循环,代码简洁高效:

# 获取所有不重复的顶级列名称
top_level_cols = df.columns.get_level_values(0).unique()

# 生成包含Diff子列的DataFrame,保持多层列结构
diff_df = pd.DataFrame(
    {col: df[(col, 'B')].diff() for col in top_level_cols},
    columns=pd.MultiIndex.from_product([top_level_cols, ['Diff']])
)

# 合并原数据与差值列,并按顶级列排序子列
result = pd.concat([df, diff_df], axis=1).sort_index(axis=1, level=0)

代码说明:

  1. 提取顶级列:df.columns.get_level_values(0).unique()快速获取所有顶级列(First、Second),避免手动硬编码。
  2. 生成差值列:通过字典推导式为每个顶级列的B列计算diff(),并用pd.MultiIndex.from_product构建和原数据匹配的多层列索引,确保后续合并时列结构对齐。
  3. 合并与排序:pd.concat横向合并原DataFrame和差值列,sort_index(axis=1, level=0)将每个顶级列下的A、B、Diff子列归为一组,实现目标格式。

运行后即可得到符合要求的DataFrame,全程利用pandas的内置矢量化操作,性能远优于循环实现。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 10:32:27