對於Dataframe中同一列,如果有多個條件,則不能使用and運算符,需要使用&位運算符。示例如下:
import pandas as pd
df = pd.DataFrame({'name':['a','a','b','b'],'classes':[1,2,3,4],'price':[11,22,33,44]})
print(df[(df['price']>11) and (df['price']<44)])
如果需要找到價格在20到40之間的行,則使用上述代碼編譯器報如下錯誤:
Traceback (most recent call last):
File "<input>", line 1, in <module>
File "/Users/wangxxin/miniconda3/lib/python3.7/site-packages/pandas/core/generic.py", line 1576, 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().
報錯的大概意思就是值是模棱兩可,不清晰的,系統無法處理。
這個時間,如果把上述最後一句代碼調整爲:
df.loc[(df['price']>11) & (df['price']<44)]
#就可以輸出正確的內容,如下表示:
name classes price
1 a 2 22
2 b 3 33
那麼疑問來了,爲什麼使用and會報錯,而使用&不會報錯呢?
這個時候需要回歸問題的本質:and與&到底有什麼區別?
1、and是python中的邏輯運算符;
2、&是python中的位運算符;
例如:
你可以使用and來表示:1 and 2 =2
但是如果二進制的位運算,則是and無法勝算的
#a=60,二進制數爲:0011 1100
a = 0b111100
#b=13,二進制數爲:0000 1101
b=0b1101
#a&b,按位運算,應該爲:0000 1100,bn 也就是下面的值:12
a&b
12
好了,理解完and與&的區別,後,我們再來看
df[(df['price']>11) and (df['price']<44)]
與
df.loc[(df['price']>11) & (df['price']<44)]
的區別。直接看還是有點不清楚的,再看df[‘price’]>11打印出來看一下,也許就清晰了,結果如下:
df['price']>11
0 False
1 True
2 True
3 True
Name: price, dtype: bool
這樣就一目瞭然了,因爲他的值並不是一個數值,而是一個seriers,需要進行按位運算的,所以只能使用&,而不能使用and運算符。