当我使用时:
df = data2analyse.loc[data2analyse.bool_var1 | data2analyse.bool_var2 |
data2analyse.bool_var3, 'some column']
工作正常。但如果我使用
df = data2analyse.loc[data2analyse.bool_var1 is True | data2analyse.bool_var2 is True |
data2analyse.bool_var3 is True, 'some column']
引发 KeyError: False
异常。另外,如果我使用
df = data2analyse.loc[data2analyse.bool_var1 == True | data2analyse.bool_var2 == True |
data2analyse.bool_var3 == True, 'some column']
引发:ValueError:系列的真值不明确。使用 a.empty、a.bool()、a.item()、a.any() 或 a.all()。
.loc
上下文中的这些符号有什么区别?错误的原因是什么?
最佳答案
在这种情况下,您不应该使用 is
运算符,因为 is
告诉您它是否是同一个对象,即是否 id()
两个对象的值相等。
In [43]: df
Out[43]:
a b c
0 False False False
1 True True True
2 True False False
3 False True False
4 True False False
In [44]: id(True)
Out[44]: 497422000
In [45]: id(False)
Out[45]: 497422032
In [46]: id(df.a)
Out[46]: 150038344
In [47]: df.a is True
Out[47]: False
In [48]: df.a is False
Out[48]: False
In [49]: df.a == False
Out[49]:
0 True
1 False
2 False
3 True
4 False
Name: a, dtype: bool
像 (==
,!=
等) 这样的运算符会被 pandas 对象覆盖 - 这就是最后一条语句正常工作的原因
所以你应该这样做:
In [50]: df.a | df.b | df.c
Out[50]:
0 False
1 True
2 True
3 True
4 True
dtype: bool
In [51]: (df.a == True) | (df.b == True) | (df.c == True)
Out[51]:
0 False
1 True
2 True
3 True
4 True
dtype: bool
您也可以这样做(作为替代:df.a | df.b | df.c
):
In [55]: df.any(axis=1)
Out[55]:
0 False
1 True
2 True
3 True
4 True
dtype: bool
或者这个(作为替代:df.a & df.b & df.c
):
In [56]: df.all(axis=1)
Out[56]:
0 False
1 True
2 False
3 False
4 False
dtype: bool
关于python - 列索引器中的 bool 表达式 (Pandas) 'is' 运算符不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38130108/