逻辑运算符,用于在Pandas中进行布尔索引
我在pandas的布尔指数工作。 问题是为什么声明:
a[(a['some_column']==some_number) & (a['some_other_column']==some_other_number)]
工作正常,而
a[(a['some_column']==some_number) and (a['some_other_column']==some_other_number)]
存在错误?
例:
a=pd.DataFrame({'x':[1,1],'y':[10,20]}) In: a[(a['x']==1)&(a['y']==10)] Out: xy 0 1 10 In: a[(a['x']==1) and (a['y']==10)] Out: ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()
当你说
(a['x']==1) and (a['y']==10)
您隐式地要求Python将(a['x']==1)
和(a['y']==10)
为布尔值。
NumPy数组(长度大于1)和Pandas对象(如Series)没有布尔值 – 换句话说,
ValueError: The truth value of an array is ambiguous. Use a.empty, a.any() or a.all().
当用作布尔值时。 那是因为它不清楚它应该是真还是假 。 有些用户可能会认为它们是True,如果它们的长度非零,就像Python列表一样。 其他人可能希望它只有当它的所有元素都是真的时才是真的。 如果其中的任何元素都为“真”,则其他人可能希望它为“真”。
因为有太多相互冲突的期望,NumPy和Pandas的devise者们都会拒绝猜测,反而会产生ValueError。
相反,你必须通过调用empty()
, all()
或any()
方法来明确你想要的行为。
然而,在这种情况下,它看起来像你不想布尔评估,你想元素的逻辑和。 这就是&
二元运算符执行的操作:
(a['x']==1) & (a['y']==10)
返回一个布尔数组。
顺便说一句,正如alexpmil所指出的那样 ,括号是强制性的,因为&
比==
具有更高的运算符优先级 。 没有括号, a['x']==1 & a['y']==10
将被评估为a['x'] == (1 & a['y']) == 10
,反过来相当于链式比较(a['x'] == (1 & a['y'])) and ((1 & a['y']) == 10)
。 这是“ Series and Series
的expression。 两个Series的使用会再次触发与上面相同的ValueError
。 这就是为什么括号是强制性的。