如何为多级索引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)
代码说明:
- 提取顶级列:
df.columns.get_level_values(0).unique()快速获取所有顶级列(First、Second),避免手动硬编码。 - 生成差值列:通过字典推导式为每个顶级列的
B列计算diff(),并用pd.MultiIndex.from_product构建和原数据匹配的多层列索引,确保后续合并时列结构对齐。 - 合并与排序:
pd.concat横向合并原DataFrame和差值列,sort_index(axis=1, level=0)将每个顶级列下的A、B、Diff子列归为一组,实现目标格式。
运行后即可得到符合要求的DataFrame,全程利用pandas的内置矢量化操作,性能远优于循环实现。
内容的提问来源于stack exchange,提问作者YudoSmootho
相关产品推荐
相关产品推荐

