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
相关产品推荐
相关产品推荐

