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

Pandas中按Type分组并结合IsSold非零条件计算Vol列求和的优化方案咨询

Pandas中按Type分组并结合IsSold非零条件计算Vol列求和的优化方案咨询

嗨,你的问题很典型——当分组类别多的时候,手动循环维护变量确实太麻烦了,而且效率也不高。用groupby来处理绝对是更优的选择,我给你分享几个简洁高效的解决方案:

方法1:先过滤符合条件的行,再分组求和(推荐)

这种方法最直观,先把IsSold为1的行筛选出来,再按Type分组对Vol求和,完全不需要手动维护每个分组的变量:

import pandas as pd

# 先把你的数据转成DataFrame
data = {'Type': ['A', 'A', 'B', 'C', 'C'] ,
        'Vol' : [10, 20, 15, 15, 15] ,
        'Cost' : [500, 300, 200, 400, 400] ,
        'IsSold' : [1, 0, 1, 1, 0]}
df = pd.DataFrame(data)

# 第一步:筛选IsSold非零的行
filtered_df = df[df['IsSold'] == 1]
# 第二步:按Type分组求和Vol
total_by_type = filtered_df.groupby('Type')['Vol'].sum()

# 如果需要包含像D这类没有数据的分组(默认会自动忽略),可以手动补全
all_types = ['A', 'B', 'C', 'D']
total_by_type = total_by_type.reindex(all_types, fill_value=0)

print(total_by_type)

输出结果:

A    10
B    15
C    15
D     0
dtype: int64

方法2:通过列运算转换后再分组求和

如果不想单独做过滤步骤,可以先把IsSold为0的Vol置为0,再直接分组求和:

# 用IsSold作为掩码,把不符合条件的Vol变成0
df['FilteredVol'] = df['Vol'] * df['IsSold']
# 直接分组求和转换后的列
total_by_type = df.groupby('Type')['FilteredVol'].sum()

# 同样可以补全D这类空分组
total_by_type = total_by_type.reindex(['A', 'B', 'C', 'D'], fill_value=0)

为什么这两种方法比循环好?

  • 自动适配所有分组:不管你的Type新增多少类别,都不需要手动新增变量,代码不用改
  • 效率更高:Pandas的分组和筛选都是向量化操作,比Python原生循环快得多,数据量越大差距越明显
  • 可读性更强:代码逻辑清晰,别人一看就懂,后期维护也方便

备注:内容来源于stack exchange,提问作者FZL

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.23 07:03:11