這個問題以前是由用戶提出(然后洗掉)的,我正在尋找解決方案,以便在問題消失時給出答案,而且我似乎無法理解 pandas 的行為,所以我希望澄清一些,原始問題說明了以下內容:
如何在 Pandas 資料框中用 NaN 替換除給定串列中的所有負值?
我重現該場景的設定如下:
import pandas as pd
import numpy as np
df = pd.DataFrame({
'A' : [x for x in range(4)],
'B' : [x for x in range(-2, 2)]
})
從技術上講,這應該只是將布爾運算式正確傳遞給 pd.where 的問題,我嘗試的解決方案如下所示:
df[df >= 0 | df.isin([-2])]
產生:
| 指數 | 一種 | 乙 |
|---|---|---|
| 0 | 0 | 鈉 |
| 1 | 1 | 鈉 |
| 2 | 2 | 0 |
| 3 | 3 | 1 |
這也取消了串列中的數字!
此外,如果我用這兩個條件中的每一個屏蔽資料框,我會得到正確的行為:
with df[df >= 0](與復合結果相同)
| 指數 | 一種 | 乙 |
|---|---|---|
| 0 | 0 | 鈉 |
| 1 | 1 | 鈉 |
| 2 | 2 | 0 |
| 3 | 3 | 1 |
with df[df.isin([-2])](與復合結果相同)
| 指數 | 一種 | 乙 |
|---|---|---|
| 0 | 鈉 | -2.0 |
| 1 | 鈉 | 鈉 |
| 2 | 鈉 | 鈉 |
| 3 | 鈉 | 鈉 |
所以我好像
- 由于對 NaN 值執行邏輯而遇到一些未定義的行為
- 我有問題
任何人都可以向我澄清這種情況嗎?
uj5u.com熱心網友回復:
解決方案
df[(df >= 0) | (df.isin([-2]))]
解釋
在 python 中,按位 OR, |, 具有比比較運算子更高的運算子優先級,例如>=:https ://docs.python.org/3/reference/expressions.html#operator-precedence
在多個布爾條件上過濾 pandas DataFrame 時,您需要將每個條件括在括號中。更多來自pandas 用戶指南的布爾索引部分:
另一種常見的操作是使用布爾向量來過濾資料。運算子是:
|foror、&forand和~fornot。這些 必須使用括號進行分組,因為默認情況下 Python 將評估運算式,例如df['A'] > 2 & df['B'] < 3,df['A'] > (2 & df['B']) < 3而所需的評估順序是(df['A'] > 2) & (df['B'] < 3)。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/467780.html
上一篇:如何處理錯誤不支持的運算元型別
