如何在多层索引DataFrame的同一行中为不同列应用不同公式?
解决多层索引DataFrame添加多逻辑汇总行问题
要给你的多层索引DataFrame添加一行名为Total的汇总行,同时对ID1列用cumprod计算、ID2列用均值计算,不用分开生成两个行再合并,直接针对不同列赋值即可,步骤如下:
先统一数据构造与多层索引代码
先修正原代码中的变量名不一致问题,确保后续逻辑能正常运行:
import pandas as pd # 数据构造 data = {'ID1': [1.0, 2.0,1.2,1.7,0.8,0.9], 'ID2': [5.0,3.0,7.0,2.0,1.0,6.0], 'Date': ['10-31-2022','12-31-2022','10-31-2022','12-31-2022','10-31-2022','12-31-2022'], 'Name': ['John', 'John', 'Kat', 'Kat', 'Adam','Adam']} df = pd.DataFrame(data=data) # 构造多层索引 df = df.set_index(["Date", "Name"]) df = df.unstack().swaplevel(0,1, axis=1).sort_index(axis=1, level=0, sort_remaining=False)
方法一:构造汇总行后合并(不修改原DataFrame)
先分别计算两类列的结果,再合并成一行添加到原表:
# 计算ID1列的最终cumprod结果:(1+列值)累乘后减1,取最后一行 id1_result = (1 + df.filter(like='ID1')).cumprod(skipna=True).iloc[-1] # 计算ID2列的均值 id2_result = df.filter(like='ID2').mean() # 构造Total行:先初始化空Series,再分别更新对应列的值 total_row = pd.Series(index=df.columns, name='Total') total_row.update(id1_result) total_row.update(id2_result) # 将汇总行合并到原DataFrame df_with_total = pd.concat([df, total_row.to_frame().T])
方法二:直接在原表中添加并赋值(inplace修改)
通过loc直接创建Total行,再分别给ID1、ID2列填充对应结果:
# 先创建空的Total行 df.loc['Total'] = pd.NA # 给所有ID1列赋值cumprod结果 df.loc['Total', df.columns.get_level_values(1) == 'ID1'] = (1 + df.filter(like='ID1')).cumprod(skipna=True).iloc[-1].values # 给所有ID2列赋值均值 df.loc['Total', df.columns.get_level_values(1) == 'ID2'] = df.filter(like='ID2').mean().values
关键说明
- 两种方法都避免了生成两个Total行再合并的冗余操作,直接一次性构造符合要求的汇总行
- 针对多层索引列的筛选,
filter(like='ID1')或columns.get_level_values(1) == 'ID1'都能精准定位目标列 - 原代码中
append方法已被pandas弃用,建议用pd.concat替代
内容的提问来源于stack exchange,提问作者Matt
相关产品推荐
相关产品推荐

