逻辑运算符,用于在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 。 这就是为什么括号是强制性的。