基于pandas其他列值对列应用函数时出现ValueError该如何解决?
错误原因
apply调用语法错误:你写的df.apply(sales_gbp(df), axis=1)相当于先执行sales_gbp(df)把整个DataFrame传入函数,此时cur = df.cur拿到的是整列的Series对象,对Series做if cur == 'USD'的布尔判断时,pandas无法判断你要对整个序列还是单个元素做判断,就会抛出真值模糊的报错。apply传入自定义函数只需要写函数名,不需要加括号和参数。- 函数内部变量名不匹配:你定义了
value = df.val,但后续计算用的是未定义的val,运行也会抛出变量未找到报错。
修复后的正确写法
首先修正自定义函数:
def sales_gbp(row): cur = row.cur val = row.val # 统一变量名 if cur == 'USD': return val*0.72 elif cur == 'EUR': return val*0.85 else: return val
调用apply时仅传入函数名即可:
# 若val列是字符串格式的object,先转数值类型 df['val'] = df['val'].astype(float) df['value_GBP'] = df.apply(sales_gbp, axis=1)
更高效的向量化实现(推荐)
apply逐行遍历性能很低,数据量大时建议用汇率映射的向量化操作,无需循环:
# 定义汇率映射字典 rate_map = {'USD':0.72, 'EUR':0.85, 'GBP':1} df['val'] = df['val'].astype(float) df['value_GBP'] = df['val'] * df['cur'].map(rate_map)
内容的提问来源于stack exchange,提问作者Jonas Palačionis
相关产品推荐
相关产品推荐

