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

如何在多层索引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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 17:35:12