從pandas DataFrame中刪除nan和inf/-inf值而不重置mode.use_inf_as_null
的最快/最簡單的方法是什麼?我希望能夠使用的dropna
的subset
和how
參數,除非考慮失蹤,像inf
值:在熊貓的數據框中放入無限值?
df.dropna(subset=["col1", "col2"], how="all", with_inf=True)
這可能嗎?有沒有辦法告訴dropna
在缺失值的定義中包含inf
?
從pandas DataFrame中刪除nan和inf/-inf值而不重置mode.use_inf_as_null
的最快/最簡單的方法是什麼?我希望能夠使用的dropna
的subset
和how
參數,除非考慮失蹤,像inf
值:在熊貓的數據框中放入無限值?
df.dropna(subset=["col1", "col2"], how="all", with_inf=True)
這可能嗎?有沒有辦法告訴dropna
在缺失值的定義中包含inf
?
最簡單的方式是首先replace
的infs爲NaN:
df.replace([np.inf, -np.inf], np.nan)
,然後使用dropna
:
df.replace([np.inf, -np.inf], np.nan).dropna(subset=["col1", "col2"], how="all")
例如:
In [11]: df = pd.DataFrame([1, 2, np.inf, -np.inf])
In [12]: df.replace([np.inf, -np.inf], np.nan)
Out[12]:
0
0 1
1 2
2 NaN
3 NaN
同樣的方法將爲一個系列工作。
上述解決方案將修改不在目標列中的inf
。爲了彌補這方面,
lst = [np.inf, -np.inf]
to_replace = dict((v, lst) for v in ['col1', 'col2'])
df.replace(to_replace, np.nan)
下面是使用.loc
另一種方法在系列與南更換INF:
s.loc[(~np.isfinite(s)) & s.notnull()] = np.nan
因此,爲應對原題:
df = pd.DataFrame(np.ones((3, 3)), columns=list('ABC'))
for i in range(3):
df.iat[i, i] = np.inf
df
A B C
0 inf 1.000000 1.000000
1 1.000000 inf 1.000000
2 1.000000 1.000000 inf
df.sum()
A inf
B inf
C inf
dtype: float64
df.apply(lambda s: s[np.isfinite(s)].dropna()).sum()
A 2
B 2
C 2
dtype: float64
隨着選項的上下文,這可能沒有永久設置use_inf_as_null
。例如:
with pd.option_context('mode.use_inf_as_null', True):
df = df.dropna(subset=['col1', 'col2'], how='all')
當然也可以設置成與pd.set_option('use_inf_as_null', True)
永久治療inf
爲NaN
了。
這是最可讀的答案,因此是最好的,即使它違反了信(但不是在靈)原來的問題。 – ijoseph
另一種解決方案是使用isin
方法。用它來確定每個值是無限還是丟失,然後鏈接all
方法以確定行中的所有值是無限還是缺失。
最後,使用該結果的否定,通過布爾索引來選擇沒有全部無限值或缺失值的行。
all_inf_or_nan = df.isin([np.inf, -np.inf, np.nan]).all(axis='columns')
df[~all_inf_or_nan]
蟒蛇2.7和更高的支持字典內涵:'{V:LST中的cols V}' –