pandas apply调用双参数lambda报错缺少位置参数y如何解决
报错原因
- 核心问题1:
apply方法默认参数axis=0,是按列遍历DataFrame,每次仅将1个整列的Series对象作为参数传入调用的函数,你定义的lambda需要x、y两个入参,实际只收到1个参数,自然触发缺少位置参数y的报错。 - 核心问题2:就算手动加
axis=1改成按行遍历,每次传入的也是包含cost、leads两个字段的单行Series对象,依然只传1个参数,还是匹配不了lambda的两个入参。 - 额外问题:你写的
cpl_calc函数只有打印逻辑,没有return返回计算结果,就算apply逻辑跑通,最终生成的cpl列也会全是空值。
可直接运行的修正方案
首先先补全自定义函数的返回值,同时导入依赖库、构造基础数据集:
import pandas as pd # 构造数据集 data = {'key': ['one', 'two', 'zero'], 'cost': [300, 20, 500], 'leads': [20, 0, 50]} data = pd.DataFrame(data=data) # 修正自定义函数,补上return返回计算结果 def cpl_calc(x, y): if x == 0: cpl = y else: cpl = y / x return cpl
方案1:修正apply传参逻辑(最贴合原有写法)
加axis=1参数改为逐行遍历,从每行的Series对象中按列名取出对应值,按参数顺序传入自定义函数即可:
# 注意参数顺序:cpl_calc第一个入参x是leads,第二个入参y是cost data['cpl'] = data.apply(lambda row: cpl_calc(row['leads'], row['cost']), axis=1)
方案2:向量化计算(性能最优,推荐大数据量场景使用)
不用逐行apply,直接用numpy的条件判断做向量化运算,运行速度比apply快数倍到数十倍:
import numpy as np data['cpl'] = np.where( data['leads'] == 0, # 判断条件:leads等于0 data['cost'], # 条件为真时取cost值 data['cost']/data['leads'] # 条件为假时取cost/leads )
运行结果
两种方案运行后得到的DataFrame结果一致,cpl列计算完全符合预期:
key cost leads cpl 0 one 300 20 15.0 1 two 20 0 20.0 2 zero 500 50 10.0
内容的提问来源于stack exchange,提问作者Vladislav
相关产品推荐
相关产品推荐

