pandas:使用多個條件過濾資料框
在 pandas 中,按多列中的值過濾資料框可能很棘手。使用 AND 運算子 (&) 時,您可能會期望它的行為類似於 OR 運算子 (|),反之亦然。
考慮以下測試程式碼:
<code class="python">df = pd.DataFrame({'a': range(5), 'b': range(5) }) df['a'][1] = -1 df['b'][1] = -1 df['a'][3] = -1 df['b'][4] = -1 df1 = df[(df.a != -1) & (df.b != -1)] df2 = df[(df.a != -1) | (df.b != -1)] print(pd.concat([df, df1, df2], axis=1, keys=[ 'original df', 'using AND (&)', 'using OR (|)',]))</code>
意外的情況結果中出現以下行為:
original df using AND (&) using OR (|) a b a b a b 0 0 0 0 0 0 0 1 -1 -1 NaN NaN NaN NaN 2 2 2 2 2 2 2 3 -1 3 NaN NaN -1 3 4 4 -1 NaN NaN 4 -1 [5 rows x 6 columns]
AND 運算子(&) 會刪除至少一個值為-1 的每一行,而OR 運算子(|) 僅刪除兩個值為-1 的行。此行為與預期相反。
此行為的原因在於這些運算符的使用方式。在 AND 條件中,您指定保留兩個條件都為 true 的行,這相當於刪除至少一個條件為 false 的行。相反,OR 條件指定保留任一條件為 true 的行,這相當於刪除兩個條件都為 false 的行。
為了確保清晰並避免混淆,建議對條件使用明確表示法涉及多個欄位。不要使用運算子連結多個條件,而是使用括號對條件進行分組並明確它們的邏輯關係。
例如,以下程式碼明確指定AND 條件:
<code class="python">df1 = df[(df.a != -1) & (df.b != -1)]</code>
而下列程式碼明確指定OR 條件:
<code class="python">df2 = df[(df.a != -1) | (df.b != -1)]</code>
透過使用明確表示法,您可以確保您的條件按預期解釋並防止意外行為。
以上是為什麼 pandas 中的 AND 運算子(&)在按多個條件過濾資料幀時表現得像 OR 運算符(|)?的詳細內容。更多資訊請關注PHP中文網其他相關文章!