Pandas DataFrame按其他列条件分组对两列求和报错处理
报错原因
代码触发错误的核心原因有三个:
- 条件判断写法错误:
if tx_accepted_1 and tx_accepted == "True"只校验了tx_accepted等于字符串"True",tx_accepted_1直接传入了从分组里取到的整列Series对象。pandas不支持把整列Series直接转成单个布尔值做真假判断,就会抛出你看到的真值歧义错误。 - 判断逻辑有漏洞:就算不报错,这个写法也不会校验
tx_accepted_1的值是不是"True",只要列非空就会被判定为真,完全不符合"两个字段均为'True'才计算"的需求。 - 自定义函数传参逻辑不对:分组
apply传入的x是每个分组对应的DataFrame子集,你把整列数据传给自定义函数后直接用if判断,本质是拿一整列数据做单值判断,必然触发报错。
实现方案
优先使用向量化写法,运行效率比逐组apply高很多:
# 1. 先筛出两个accept字段均为字符串"True"的行 # 2. 按Subject、date分组,对两个金额字段分别求和 # 3. 把同一分组下两个金额列的求和结果相加,得到最终组内总金额 result = ( data.loc[data["Accept"].eq("True") & data["accept_1"].eq("True"), :] .groupby(["Subject", "date"])[["Amount", "amount_1"]] .sum() .sum(axis=1) .reset_index(name="total_amount") )
如果你要保留自定义函数+apply的写法,可以把函数改成直接处理分组DataFrame的逻辑:
def group_sum(group): # 筛选组内符合双True条件的行 valid_rows = group[(group["Accept"] == "True") & (group["accept_1"] == "True")] # 返回两个金额字段的总和 return valid_rows["Amount"].sum() + valid_rows["amount_1"].sum() result = data.groupby(["Subject", "date"]).apply(group_sum).reset_index(name="total_amount")
注意事项
- pandas做字段多条件筛选时,组合逻辑要用
&(与)、|(或)等位运算符,每个独立判断条件必须用括号包裹,不要直接用Python原生的and/or处理Series对象。 - 不要把整列/Series对象直接放到原生
if语句里做判断,这种写法pandas无法判定你是要判断整列全为真、存在任意真值还是其他逻辑,必然抛出歧义错误。
内容的提问来源于stack exchange,提问作者Almosino
相关产品推荐
相关产品推荐

