Pandas使用或声明切片/选择多个条件

时间:2017-02-07 05:28:33

标签: python python-3.x pandas

当我通过用“AND”链接不同条件进行选择时,选择工作正常。当我通过链接条件选择“或”时,选择会引发错误。

>>> import pandas as pd
>>> import numpy as np
>>> df = pd.DataFrame([[1,4,3],[2,3,5],[4,5,6],[3,2,5]], 
...     columns=['a', 'b', 'c'])
>>> df
   a  b  c
0  1  4  3
1  2  3  5
2  4  5  6
3  3  2  5
>>> df.loc[(df.a != 1) & (df.b < 5)]
   a  b  c
1  2  3  5
3  3  2  5
>>> df.loc[(df.a != 1) or (df.b < 5)]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python3/dist-packages/pandas/core/generic.py", line 731, in __nonzero__
    .format(self.__class__.__name__))
ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().

我希望它能返回整个数据帧,因为所有行都满足这个条件。

1 个答案:

答案 0 :(得分:12)

需要注意的重要一点是&and不同,它们是不同的东西所以&#34;或&#34;相当于& |

通常,&|都是按位逻辑运算符,而不是python&#34;逻辑&#34;运算符。

在pandas中,这些运算符因Series操作而过载。

In [1]: import pandas as pd

In [2]: import numpy as np

In [3]: df = pd.DataFrame([[1,4,3],[2,3,5],[4,5,6],[3,2,5]], columns=['a', 'b',
   ...:  'c'])

In [4]: df
Out[4]:
   a  b  c
0  1  4  3
1  2  3  5
2  4  5  6
3  3  2  5

In [5]: df.loc[(df.a != 1) & (df.b < 5)]
Out[5]:
   a  b  c
1  2  3  5
3  3  2  5

In [6]: df.loc[(df.a != 1) | (df.b < 5)]
Out[6]:
   a  b  c
0  1  4  3
1  2  3  5
2  4  5  6
3  3  2  5