如何从数据帧中删除nan, inf和-inf值而不重置模式。use_inf_as_null?
我可以告诉dropna包括inf在其缺失值的定义,以便以下工作?
df.dropna(subset=["col1", "col2"], how="all")
如何从数据帧中删除nan, inf和-inf值而不重置模式。use_inf_as_null?
我可以告诉dropna包括inf在其缺失值的定义,以便以下工作?
df.dropna(subset=["col1", "col2"], how="all")
当前回答
使用选项上下文,无需永久设置use_inf_as_na就可以实现这一点。例如:
with pd.option_context('mode.use_inf_as_na', True):
df = df.dropna(subset=['col1', 'col2'], how='all')
当然,它可以被设置为永久地将inf视为NaN
pd.set_option('use_inf_as_na', True)
对于旧版本,请将use_inf_as_na替换为use_inf_as_null。
其他回答
使用选项上下文,无需永久设置use_inf_as_na就可以实现这一点。例如:
with pd.option_context('mode.use_inf_as_na', True):
df = df.dropna(subset=['col1', 'col2'], how='all')
当然,它可以被设置为永久地将inf视为NaN
pd.set_option('use_inf_as_na', True)
对于旧版本,请将use_inf_as_na替换为use_inf_as_null。
使用(快捷简单):
df = df[np.isfinite(df).all(1)]
这个答案是基于DougR在另一个问题中的回答。 下面是一个示例代码:
import pandas as pd
import numpy as np
df=pd.DataFrame([1,2,3,np.nan,4,np.inf,5,-np.inf,6])
print('Input:\n',df,sep='')
df = df[np.isfinite(df).all(1)]
print('\nDropped:\n',df,sep='')
结果:
Input:
0
0 1.0000
1 2.0000
2 3.0000
3 NaN
4 4.0000
5 inf
6 5.0000
7 -inf
8 6.0000
Dropped:
0
0 1.0
1 2.0
2 3.0
4 4.0
6 5.0
8 6.0
还有一种解决方案是使用isin方法。使用它来确定每个值是无限的还是缺失的,然后链接all方法来确定行中的所有值是无限的还是缺失的。
最后,使用该结果的负数通过布尔索引选择不全是无穷大或缺失值的行。
all_inf_or_nan = df.isin([np.inf, -np.inf, np.nan]).all(axis='columns')
df[~all_inf_or_nan]
只是偶然发现了这一个,我发现了一行没有替换或numpy:
df = pd.DataFrame(
[[1, np.inf],
[1, -np.inf],
[1, 2]],
columns=['a', 'b']
)
df.query("b not in [inf, -inf]")
>>> a b
2 1 2.0
对于某些版本的pandas,可能需要在列b的名称周围使用back '。
下面是另一个使用.loc在一个Series上用nan替换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