[Pandas]Dataframe中的多條件切片爲什麼不能使用and運算符

對於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運算符。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章