如何修改搭配if语句的lambda函数 修复DataFrame条件赋值异常
错误原因
你的代码存在3个核心问题:
- 直接将lambda函数对象赋值给DataFrame列,pandas不会自动执行这个函数做逐行计算,因此列中存储的是函数本身的内存地址标识,也就是你看到的
<function <lambda> at 0x000002B0251C7700>输出。 - 多处列名引用缺失引号:
df[stage_x]写法会触发NameError,正确写法为df["stage_x"]。 - 逻辑写法不匹配pandas运算规则:你定义的lambda接收row参数,但函数内部没有使用该参数,直接对整个DataFrame列做运算,即便调用函数也不符合逐行判断的预期。
修复方法
优先选择pandas向量化运算实现,运行效率远高于逐行遍历,尤其适合大数据量场景:
# 提前计算各分位阈值,减少重复运算 q1 = 0.25 * df["stage_y"] q2 = 0.5 * df["stage_y"] q3 = 0.75 * df["stage_y"] # 布尔值转整数即可实现1/0填充,True对应1,False对应0 df["1_quarter"] = (df["stage_x"] <= q1).astype(int) df["2_quarter"] = ((df["stage_x"] > q1) & (df["stage_x"] <= q2)).astype(int) df["3_quarter"] = ((df["stage_x"] > q2) & (df["stage_x"] <= q3)).astype(int) df["4_quarter"] = ((df["stage_x"] > q3) & (df["stage_x"] <= df["stage_y"])).astype(int)
注意:pandas中多条件组合判断不能用原生
and/or,要替换为按位运算符&/|,且每个独立条件必须用括号包裹,否则会因运算优先级问题报错。
如果你一定要用lambda实现逐行判断(不推荐,数据量大时运行速度慢),需要搭配apply方法指定按行遍历,正确引用行内字段:
df["1_quarter"] = df.apply(lambda row: 1 if row["stage_x"] <= 0.25*row["stage_y"] else 0, axis=1) df["2_quarter"] = df.apply(lambda row: 1 if (row["stage_x"] > 0.25*row["stage_y"] and row["stage_x"] <= 0.5*row["stage_y"]) else 0, axis=1) df["3_quarter"] = df.apply(lambda row: 1 if (row["stage_x"] > 0.5*row["stage_y"] and row["stage_x"] <= 0.75*row["stage_y"]) else 0, axis=1) df["4_quarter"] = df.apply(lambda row: 1 if (row["stage_x"] > 0.75*row["stage_y"] and row["stage_x"] <= row["stage_y"]) else 0, axis=1)
代码中axis=1参数指定按行遍历,lambda中的row代表当前行的Series对象,通过列名索引取值才能完成逐行判断。
内容的提问来源于stack exchange,提问作者Alexander Barkar
相关产品推荐
相关产品推荐

