我正在使用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()

推荐答案

当你说

(a['x']==1) and (a['y']==10)

您隐式地要求Python将(a['x']==1)(a['y']==10)转换为布尔值.

NumPy数组(长度大于1)和Pandas对象(如Series)没有布尔值——换句话说,它们提高了

ValueError:数组的真值不明确.使用a.Empty、a.any()或a.all().

当用作布尔值时.那是因为它是unclear when it should be True or False.如果长度不为零,比如Python列表,一些用户可能会认为它们是真的.其他人可能希望它是真实的,只有当它的元素是真实的.其他人可能希望它是真的,如果any个元素是真的.

因为有太多相互矛盾的期望,NumPy和Pandas的设计师拒绝猜测,反而提出了一个错误.

相反,您必须是明确的,通过调用empty()all()any()方法来指示您想要的行为.

然而,在本例中,看起来您不需要布尔求值,而是需要element-wise逻辑and.这就是&二进制运算符执行的操作:

(a['x']==1) & (a['y']==10)

返回一个布尔array.


顺便说一下,作为alexpmil notes人,

如果没有括号,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式的表达.

Python相关问答推荐

实现的差异取决于计算出的表达是直接返回还是首先存储在变量中然后返回

计算所有前面行(当前行)中列的值

如何让 turtle 通过点击和拖动来绘制?

理解Python的二分库:澄清bisect_left的使用

使用SciPy进行曲线匹配未能给出正确的匹配

替换字符串中的多个重叠子字符串

连接两个具有不同标题的收件箱

如何记录脚本输出

发生异常:TclMessage命令名称无效.!listbox"

' osmnx.shortest_track '返回有效源 node 和目标 node 的'无'

在Python中管理打开对话框

Python脚本使用蓝牙运行在Windows 11与raspberry pi4

如何启动下载并在不击中磁盘的情况下呈现响应?

如何合并两个列表,并获得每个索引值最高的列表名称?

使用Python查找、替换和调整PDF中的图像'

找到相对于列表索引的当前最大值列表""

如何使用Azure Function将xlsb转换为xlsx?

合并相似列表

Matplotlib中的曲线箭头样式

与同步和异步客户端兼容的Python函数