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

Pandas:为MultiIndex结构添加各bin的合计列

为MultiIndex结构的DataFrame添加分组合计列

需求说明

需要给按bin和item分组后的MultiIndex DataFrame添加Total列,显示每个bin下所有item的qty总和;后续要筛选出Total不足指定值的bin,同时保留单个item的数量信息,询问是否可用lambda函数实现。

原始代码

import pandas as pd

data = [['Jacket 1', 10, 'A'], ['Jacket 2', 2, 'A'], ['Jacket 3', 1, 'B'], ['Jacket 4', 3, 'B']]
df = pd.DataFrame(data, columns=['item', 'qty', 'bin'])

# 按bin和item分组求和
grouped = df.groupby(['bin', 'item']).agg({'qty': 'sum'})

分组后的数据结构:

qty
bin item    
A   Jacket 1    10
    Jacket 2     2
B   Jacket 3     1
    Jacket 4     3

解决方案

1. 使用lambda函数实现合计列

可以通过groupby.transform结合lambda函数,为每个bin计算总和并添加到对应行:

# 按bin层级分组,用lambda计算每组qty的总和
grouped['Total'] = grouped.groupby(level='bin')['qty'].transform(lambda x: x.sum())

执行后结果:

qty  Total
bin item                
A   Jacket 1    10     12
    Jacket 2     2     12
B   Jacket 3     1      4
    Jacket 4     3      4

2. 更简洁的实现方式(无需lambda)

直接用sum作为transform的参数,代码更简洁高效:

grouped['Total'] = grouped.groupby(level='bin')['qty'].transform('sum')

3. 后续筛选操作

如果需要筛选Total不足指定值的bin(比如筛选Total<5的bin),直接按列条件过滤即可:

# 筛选Total小于5的所有行
filtered_grouped = grouped[grouped['Total'] < 5]

筛选结果:

qty  Total
bin item                
B   Jacket 3     1      4
    Jacket 4     3      4

补充说明

如果想要和你示例中一样,仅在每个bin的第一行显示Total、其余行留空,可以用以下代码(但这种格式不利于后续筛选,更推荐每行都保留Total值):

grouped['Total'] = grouped.groupby(level='bin')['qty'].transform(
    lambda x: x.sum() if x.index[0][1] == x.name[1] else None
)

执行后结果:

qty  Total
bin item                
A   Jacket 1    10   12.0
    Jacket 2     2    NaN
B   Jacket 3     1    4.0
    Jacket 4     3    NaN

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 23:22:16