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