Python如何基于DataFrame指定列条件实现对应值的累计求和
解决方案
报错原因
你原来的代码data['SumA'] = data['Quantity'].cumsum() if data[(data['Type'] == 'A')]报错是因为Python原生if语句仅支持判断标量布尔值,而data[(data['Type'] == 'A')]返回的是布尔索引筛选后的Series/数据框,无法直接作为if的判断条件,也不能实现逐行条件判断的逻辑。
实现代码
方法1:手动指定要累计的类型(适合类型少的场景)
核心逻辑是:把非目标类型的行对应的数量替换为0,再做累计求和,非目标行加0就会自动保留上一个累计值。
import pandas as pd # 构造测试数据 data = pd.DataFrame({ 'Type': ['A', 'B', 'B', 'A'], 'Quantity': [30, 10, 5, 3] }) # 分别计算各类型的累计和 data['Sum A'] = data['Quantity'].where(data['Type'] == 'A', 0).cumsum() data['Sum B'] = data['Quantity'].where(data['Type'] == 'B', 0).cumsum()
运行后得到的结果和你期望的完全一致。
方法2:自动生成所有类型的累计列(适合类型多的场景)
如果Type列的取值很多,不需要逐个手写,用独热编码批量处理即可:
import pandas as pd data = pd.DataFrame({ 'Type': ['A', 'B', 'B', 'A'], 'Quantity': [30, 10, 5, 3] }) # 生成类型独热编码,乘以对应数量后累计求和 type_dummies = pd.get_dummies(data['Type']) sum_cols = type_dummies.mul(data['Quantity'], axis=0).cumsum().add_prefix('Sum ') data = pd.concat([data, sum_cols], axis=1)
内容的提问来源于stack exchange,提问作者Sara.SP92
相关产品推荐
相关产品推荐

