pandas如何在列上执行比较

时间:2013-08-06 20:42:05

标签: python pandas

我需要找到two1.5之间库仑3.5值的所有行。我期待的结果是索引1和2的行。我尝试了以下代码,但收到错误。

>>> d = {'one' : [1., 2., 3., 4.],
...  'two' : [4., 3., 2., 1.],
... 'three':['a','b','c','d']}
>>> d
{'three': ['a', 'b', 'c', 'd'], 'two': [4.0, 3.0, 2.0, 1.0], 'one': [1.0, 2.0, 3.0, 4.0]}
>>> DataFrame(d)
   one three  two
0    1     a    4
1    2     b    3
2    3     c    2
3    4     d    1
>>> df = DataFrame(d)
>>> df[1.5 <= df['two'] <= 3.5]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()
>>> 

2 个答案:

答案 0 :(得分:5)

不幸的是,你不能用numpy(因此是pandas)进行链式比较。改为:

df[(1.5 <= df.two) & (df.two <= 3.5)]

答案 1 :(得分:5)

一个非答案的排序,但我想我会分享

在pandas == 0.13(下一个主要版本)中,您将能够执行以下操作

df['1.5 <= two <= 3.5']
# or use the query method
df.query('1.5 <= two <= 3.5')

在引擎盖下,它使用pd.eval函数,它将链式比较重写为通常如何编写它们,然后将结果字符串传递给numexpr。它还将DataFrame中的列(以及索引和列索引)“附加”到特定于查询的命名空间(这可由用户控制,但默认为前面提到的元素)。您还可以使用andor和{{1}的方式使用not&|个关键字标准Python中的按位运算符。