python - isin - pandas where



Pandas中布尔索引的逻辑运算符 (1)

当你说

(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列表。 其他人可能希望它只有在其所有元素都是真的时才是真的。 如果其中任何元素为True,其他人可能希望它为True。

因为有太多相互冲突的期望,NumPy和Pandas的设计师拒绝猜测,而是提出了一个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的表达。 使用and使用两个Series将再次触发与上面相同的ValueError 。 这就是为什么括号是强制性的。

我在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:    x   y
     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()




boolean-logic