自定义函数无法输出:Pandas apply报Series真值歧义错误求助
解决Pandas apply函数报错:The truth value of a Series is ambiguous
问题背景
使用的数据表如下:
| 序号 | Academic | 年份 | 当前年份 |
|---|---|---|---|
| 0 | 0.0 | 0 | 2022 |
| 1 | 0.0 | 0 | 2022 |
| 2 | 0.0 | 0 | 2022 |
| ... | ... | ... | ... |
| 5301 | 3.0 | 0 | 2019 |
| 5302 | 3.0 | 0 | 2019 |
自定义转换函数:
def convert(Academic, current, year): if Academic == 0.0 | current == 0: year += 4 elif Academic == 1.0 | current == 1: year += 3 elif Academic == 2.0 | current == 2: year += 2 elif Academic == 3.0 | current == 3: year += 1 else: year return year
尝试生成新列的代码:
df['Passing'] = df.apply(convert(df["Academic"], df["current"], df["year"]), axis=1)
报错信息:
The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().
错误原因
- apply调用方式错误:直接传入
convert(...)会把整列Series传入函数,函数内的条件判断会返回布尔Series,Pandas无法确定整个Series的真值,引发歧义错误。 - 列名不匹配:数据表中的列是
当前年份,但代码中写的是df["current"],会导致KeyError。 - 逻辑运算符错误:用位运算符
|代替了逻辑或or,逐行判断时应该用or;若用向量化操作,|需要给每个条件加括号。 - 函数分支缺失返回值:else分支仅写了
year,没有明确返回,可能导致返回None。
解决方案
方案一:修正apply调用与函数逻辑
修正后的函数和调用代码:
def convert(row): # 从行数据中提取对应列的值 academic = row["Academic"] current_year = row["当前年份"] year = row["年份"] if academic == 0.0 or current_year == 0: year += 4 elif academic == 1.0 or current_year == 1: year += 3 elif academic == 2.0 or current_year == 2: year += 2 elif academic == 3.0 or current_year == 3: year += 1 # 明确返回year,else分支无需额外处理 return year # apply传入函数名,axis=1表示逐行处理 df['Passing'] = df.apply(convert, axis=1)
方案二:用向量化操作提升效率(推荐)
对于大数据量,apply逐行处理效率较低,推荐使用numpy.select实现向量化运算:
import numpy as np # 定义判断条件 conditions = [ (df["Academic"] == 0.0) | (df["当前年份"] == 0), (df["Academic"] == 1.0) | (df["当前年份"] == 1), (df["Academic"] == 2.0) | (df["当前年份"] == 2), (df["Academic"] == 3.0) | (df["当前年份"] == 3) ] # 对应条件的结果 choices = [ df["年份"] + 4, df["年份"] + 3, df["年份"] + 2, df["年份"] + 1 ] # 生成新列,默认返回原年份 df["Passing"] = np.select(conditions, choices, default=df["年份"])
内容的提问来源于stack exchange,提问作者iFrankenstein
相关产品推荐
相关产品推荐

