使用np.where多列条件生成DataFrame列时结果异常的问题排查
问题:np.where实现条件列时结果不符合预期
你写的代码里,问题出在运算符优先级上:&(按位与)的优先级比==高,所以你的条件data["col1"]==1 & data["col2"]会被Python先计算1 & data["col2"]。
因为col2是布尔值,True对应1,False对应0,所以1 & False结果是0,1 & True结果是1。之后再用data["col1"]和这个结果做相等判断:
- 索引0的
col1是0,0 == 0 → True,所以np.where返回1 - 索引5的
col1是0,0 == 0 → True,同样返回1
这就导致了不符合预期的结果。
解决办法
给每个条件单独加括号,确保先执行==判断,再用&连接两个布尔数组:
import pandas as pd import numpy as np data = pd.DataFrame({"col1": [0, 1, 1, 1,1, 0], "col2": [False, True, False, False, True, False] }) # 正确写法 data.assign(col3=np.where((data["col1"]==1) & data["col2"], 1, 0))
运行后得到的结果就是你期望的:
col1 col2 col3 0 0 False 0 1 1 True 1 2 1 False 0 3 1 False 0 4 1 True 1 5 0 False 0
补充:更简洁的实现
因为布尔值在Python里可以直接转为整数(True→1,False→0),所以也可以不用np.where,直接把条件表达式转成int类型:
data["col3"] = ((data["col1"]==1) & data["col2"]).astype(int)
效果和上面的代码完全一致。
内容的提问来源于stack exchange,提问作者Ailurophile
相关产品推荐
相关产品推荐

