Python中apply生成star0列失效问题:与age0列代码逻辑差异排查
问题分析与解决方案
嘿,我一眼就看出问题出在哪了——你在star0的条件判断里误用了位运算符|,而不是用来做逻辑判断的or!
为啥第一行代码好像能正常运行?
其实你的第一行data['age0']的代码也存在逻辑隐患,只是刚好数值的位运算结果碰巧让条件“蒙对”了。但到了第二行,x == -1 | x == 3000这类表达式的位运算结果完全不符合你的预期,导致条件永远不成立,所以那些明明符合条件的行,star0还是被赋值成了2。
两种正确的修改方式:
方式1:换成逻辑运算符or
这是最直接的修改,把所有的|替换成or就行:
data['star0'] = data['user_star_level'].apply(lambda x: 1 if x == -1 or x == 3000 or x == 3001 else 2)
方式2:用in判断(更简洁高效)
当需要判断某个值是否在一组选项里时,用in会让代码更清爽,尤其是选项数量多的时候:
data['star0'] = data['user_star_level'].apply(lambda x: 1 if x in {-1, 3000, 3001} else 2)
额外小技巧:Pandas更高效的写法
其实不用apply也能实现,用Pandas自带的isin结合np.where性能会更好(数据量大的时候差距明显):
import numpy as np data['star0'] = np.where(data['user_star_level'].isin([-1, 3000, 3001]), 1, 2)
最后再唠两句区别
|是位运算符:它会把两边的数值转成二进制按位运算,比如-1 | 3000的结果是个很大的负数,和你要判断的x完全不匹配,所以条件永远为False。or是逻辑运算符:它会依次判断每个表达式的真假,只要有一个为真,整个条件就成立,这才是你需要的逻辑判断逻辑。
内容的提问来源于stack exchange,提问作者Gemma
相关产品推荐
相关产品推荐

