第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

用于Pandas中布爾索引的邏輯運(yùn)算符

用于Pandas中布爾索引的邏輯運(yùn)算符

慕田峪9158850 2019-06-23 17:09:34
用于Pandas中布爾索引的邏輯運(yùn)算符我正在處理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)]錯(cuò)誤退出?例子:a=pd.DataFrame({'x':[1,1],'y':[10,20]})In: a[(a['x']==1)&(a['y']==10)]Out:    x   y      0  1  10In: 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()
查看完整描述

3 回答

?
qq_笑_17

TA貢獻(xiàn)1818條經(jīng)驗(yàn) 獲得超7個(gè)贊

當(dāng)你說

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

您正在隱式地要求Python進(jìn)行轉(zhuǎn)換。(a['x']==1)(a['y']==10)布爾值。

NumPy數(shù)組(長(zhǎng)度大于1)和Pandas對(duì)象(如Series)沒有布爾值-換句話說,它們引發(fā)

ValueError: The truth value of an array is ambiguous. Use a.empty, a.any() or a.all().

當(dāng)用作布爾值時(shí)。那是因?yàn)?/trans>不清楚什么時(shí)候應(yīng)該是對(duì)的還是錯(cuò)的..一些用戶可能會(huì)假設(shè)他們是真實(shí)的,如果他們有非零的長(zhǎng)度,如Python列表。其他人可能希望它是真實(shí)的,只有在它的元素是真實(shí)的。其他人可能希望它是真實(shí)的,如果任何其中的元素是真實(shí)的。

因?yàn)橛羞@么多相互沖突的期望,NumPy和Pandas的設(shè)計(jì)者拒絕猜測(cè),而是提出了一個(gè)價(jià)值錯(cuò)誤。

相反,您必須顯式地調(diào)用empty()all()any()方法來指示您想要的行為。

但是,在這種情況下,看起來不需要布爾值,而是需要元素級(jí)合乎邏輯-還有。這就是&二進(jìn)制運(yùn)算符執(zhí)行:

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

返回布爾數(shù)組。


順便說一下,列支鈔票,括號(hào)是強(qiáng)制性的,因?yàn)?/trans>&有更高的運(yùn)算符優(yōu)先==..如果沒有括號(hào),a['x']==1 & a['y']==10將被評(píng)估為a['x'] == (1 & a['y']) == 10而這又相當(dāng)于鏈?zhǔn)奖容^(a['x'] == (1 & a['y'])) and ((1 & a['y']) == 10)..這是表單的表達(dá)式。Series and Series..使用and用兩個(gè)系列賽會(huì)再次觸發(fā)相同的ValueError如上段所述。這就是為什么括號(hào)是強(qiáng)制性的。


查看完整回答
反對(duì) 回復(fù) 2019-06-23
?
慕沐林林

TA貢獻(xiàn)2016條經(jīng)驗(yàn) 獲得超9個(gè)贊

Pandas中的邏輯運(yùn)算符是&|~,和括號(hào)(...)很重要!

Python的andornot邏輯運(yùn)算符設(shè)計(jì)用于處理標(biāo)量。因此,Pandas必須做得更好,并重寫按位運(yùn)算符來實(shí)現(xiàn)。矢量化(就元素而言)此功能的版本。

下面是python中的內(nèi)容(exp1exp2是計(jì)算為布爾結(jié)果的表達(dá)式).。

exp1 and exp2              # Logical ANDexp1 or exp2               # Logical ORnot exp1                   # Logical NOT

.會(huì)翻譯成.

exp1 & exp2                # Element-wise logical ANDexp1 | exp2                # Element-wise logical OR~exp1         
             # Element-wise logical NOT

為了熊貓。

如果在執(zhí)行邏輯操作的過程中,您將得到一個(gè)ValueError,則需要使用括號(hào)進(jìn)行分組:

(exp1) op (exp2)

例如,

(df['col1'] == x) & (df['col2'] == y)

諸若此類。


布爾索引一個(gè)常見的操作是通過邏輯條件計(jì)算布爾掩碼來過濾數(shù)據(jù)。熊貓?zhí)峁?/trans>操作員:&合乎邏輯,|用于邏輯或,以及~邏輯上沒有。

考慮以下設(shè)置:

np.random.seed(0)df = pd.DataFrame(np.random.choice(10, (5, 3)), columns=list('ABC'))df

   A  B  C0  5  0  31  3  7  92  3  5  23  4  7  64  8  8  1

邏輯與

df上面,假設(shè)您想返回A<5和B>5的所有行。這是通過分別計(jì)算每個(gè)條件的掩碼來完成的,并對(duì)它們進(jìn)行處理。

重載位&操作者
在繼續(xù)之前,請(qǐng)注意以下特定的文檔摘錄:

另一個(gè)常見操作是使用布爾向量過濾數(shù)據(jù)。營(yíng)辦商包括:|or&and,和~not必須使用括號(hào)對(duì)它們進(jìn)行分組。,因?yàn)槟J(rèn)情況下Python將計(jì)算一個(gè)表達(dá)式,如df.A > 2 & df.B < 3df.A > (2 &  df.B) < 3,而所需的評(píng)估順序是(df.A > 2) & (df.B <  3).

因此,考慮到這一點(diǎn),元素分邏輯,可以用位運(yùn)算符實(shí)現(xiàn)。&:

df['A'] < 50    False1     True2     True3     True4    FalseName: A, dtype: bool

df['B'] > 50    False1     True2    False3     True4     TrueName: B, dtype: bool


(df['A'] < 5) & (df['B'] > 5)0    False1     True2    False3     True4    Falsedtype: bool

接下來的過濾步驟很簡(jiǎn)單,

df[(df['A'] < 5) & (df['B'] > 5)]

   A  B  C1  3  7  93  4  7  6

圓括號(hào)用于覆蓋按位運(yùn)算符的默認(rèn)優(yōu)先順序,后者比條件運(yùn)算符具有更高的優(yōu)先級(jí)。<>..見算子優(yōu)先在蟒蛇的文檔里。

如果不使用括號(hào),則將錯(cuò)誤地計(jì)算表達(dá)式。例如,如果您意外地嘗試了諸如

df['A'] < 5 & df['B'] > 5

它被解析為

df['A'] < (5 & df['B']) > 5

變成,

df['A'] < something_you_dont_want > 5

(請(qǐng)參閱python文檔)鏈?zhǔn)剿阕颖容^),

(df['A'] < something_you_dont_want) and (something_you_dont_want > 5)

變成,

# Both operands are Series...something_else_you_dont_want1 and something_else_you_dont_want2

拋出

ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().

所以,別犯那個(gè)錯(cuò)誤!1

避免部分分組
解決辦法其實(shí)很簡(jiǎn)單。大多數(shù)操作符都有相應(yīng)的DataFrame綁定方法。如果單個(gè)掩碼是使用函數(shù)而不是條件運(yùn)算符構(gòu)建的,則不再需要按父母分組來指定計(jì)算順序:

df['A'].lt(5)0     True1     True2     True3     True4    FalseName: A, dtype: bool

df['B'].gt(5)0    False1     True2    False3     True4     TrueName: B, dtype: bool


df['A'].lt(5) & df['B'].gt(5)0    False1     True2    False3     True4    Falsedtype: bool

靈活的比較。..總之,我們有

╒════╤════════════╤════════════╕│    │ Operator   │ Function   │╞════╪═══════════
═╪════════════╡│  0 │ >          │ gt         │├────┼────────────┼────────────
┤│  1 │ >=         │ ge         │├────┼────────────┼────────────┤│  2 │ <          │
 lt         │├────┼────────────┼────────────┤│  3 │ <=         │ le         │├────┼
 ────────────┼────────────┤│  4 │ ==         │ eq         │├────┼────────────┼─
 ───────────┤│  5 │ !=         │ ne         │╘════╧════════════╧════════════╛

避免括號(hào)的另一個(gè)選擇是使用DataFrame.query(或eval):

df.query('A < 5 and B > 5')

   A  B  C1  3  7  93  4  7  6

我有過廣泛記錄在案queryeval在……里面熊貓動(dòng)態(tài)表達(dá)評(píng)價(jià)的pd.val().

operator.and_
允許您以功能方式執(zhí)行此操作。內(nèi)部呼叫Series.__and__它對(duì)應(yīng)于位操作符。

import operator 

operator.and_(df['A'] < 5, df['B'] > 5)# Same as,# (df['A'] < 5).__and__(df['B'] > 5) 0    False1     True2    False3     True4   
 Falsedtype: bool

df[operator.and_(df['A'] < 5, df['B'] > 5)]

   A  B  C1  3  7  93  4  7  6

你通常不需要這個(gè),但是知道是有用的。

概括:np.logical_and(和logical_and.reduce)
另一種選擇是使用np.logical_and,也不需要括號(hào)分組:

np.logical_and(df['A'] < 5, df['B'] > 5)0    False1     True2    False3     True4    FalseName: A, dtype: bool

df[np.logical_and(df['A'] < 5, df['B'] > 5)]

   A  B  C1  3  7  93  4  7  6

np.logical_andUfunc(通用職能),而且大多數(shù)運(yùn)行程序都有一個(gè)reduce方法。這意味著更容易泛化。logical_and如果你有多個(gè)面具。例如,to和掩碼m1m2m3帶著&,你必須做

m1 & m2 & m3

然而,一個(gè)更容易的選擇是

np.logical_and.reduce([m1, m2, m3])

這是強(qiáng)大的,因?yàn)樗试S您在此基礎(chǔ)上構(gòu)建更復(fù)雜的邏輯(例如,在列表理解中動(dòng)態(tài)生成掩碼并添加所有掩碼):

import operator

cols = ['A', 'B']ops = [np.less, np.greater]values = [5, 5]m = np.logical_and.reduce([op(df[c], v) for op, c, v in zip(ops, cols, values)])m 
# array([False,  True, False,  True, False])df[m]
   A  B  C1  3  7  93  4  7  6

我知道我是在嘮叨這一點(diǎn),但請(qǐng)容忍我。這是一個(gè)非常非常普通初學(xué)者的錯(cuò)誤,必須非常徹底地解釋。


邏輯OR

df上面,假設(shè)您想返回A=3或B=7的所有行。

重載位|

df['A'] == 30    False1     True2     True3    False4    FalseName: A, dtype: bool

df['B'] == 70    False1     True2    False3     True4    FalseName: B, dtype: bool


(df['A'] == 3) | (df['B'] == 7)0    False1     True2     True3     True4    Falsedtype: bool

df[(df['A'] == 3) | (df['B'] == 7)]

   A  B  C1  3  7  92  3  5  23  4  7  6

如果您還沒有,請(qǐng)閱讀邏輯與以上,所有的警告都適用于此。

或者,可以用

df[df['A'].eq(3) | df['B'].eq(7)]

   A  B  C1  3  7  92  3  5  23  4  7  6

operator.or_
打電話Series.__or__在引擎蓋下面。

operator.or_(df['A'] == 3, df['B'] == 7)# Same as,# (df['A'] == 3).__or__(df['B'] == 7)0    False1     True2     True3     True4 
   Falsedtype: bool

df[operator.or_(df['A'] == 3, df['B'] == 7)]

   A  B  C1  3  7  92  3  5  23  4  7  6

np.logical_or
對(duì)于兩個(gè)條件,請(qǐng)使用logical_or:

np.logical_or(df['A'] == 3, df['B'] == 7)0    False1     True2     True3     True4    FalseName: A, dtype: bool

df[np.logical_or(df['A'] == 3, df['B'] == 7)]

   A  B  C1  3  7  92  3  5  23  4  7  6

對(duì)于多個(gè)掩碼,請(qǐng)使用logical_or.reduce:

np.logical_or.reduce([df['A'] == 3, df['B'] == 7])# array([False,  True,  True,  True, False])df[np.logical_or.reduce([df['A'] 
== 3, df['B'] == 7])]

   A  B  C1  3  7  92  3  5  23  4  7  6

邏輯不

戴上面具,如

mask = pd.Series([True, True, False])

如果您需要反轉(zhuǎn)每個(gè)布爾值(因此最終結(jié)果是[False, False, True]),則可以使用以下任何方法。

按位~

~mask0    False1    False2     Truedtype: bool

同樣,表達(dá)式需要加括號(hào)。

~(df['A'] == 3)0     True1    False2    False3     True4     TrueName: A, dtype: bool

這內(nèi)部呼叫

mask.__invert__()0    False1    False2     Truedtype: bool

但不要直接用。

operator.inv
內(nèi)部呼叫__invert__在系列賽上。

operator.inv(mask)0    False1    False2     Truedtype: bool

np.logical_not
這是矮胖的變體。

np.logical_not(mask)0    False1    False2     Truedtype: bool

注:np.logical_and可以代替np.bitwise_andlogical_or帶著bitwise_or,和logical_not帶著invert.


查看完整回答
反對(duì) 回復(fù) 2019-06-23
  • 3 回答
  • 0 關(guān)注
  • 3879 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)