Bug: 无法从DataFrame中删除无限值。

8 浏览
0 Comments

Bug: 无法从DataFrame中删除无限值。

这是我的DataFrame df:\n

col1       col2
-0.441406  2.523047
-0.321105  1.555589 
-0.412857  2.223047
-0.356610  2.513048

\n当我检查df时,我发现有一些无限值。\n

np.any(np.isnan(df))
np.all(np.isfinite(df))
False 
True

\nNaN和无限值之间有什么区别?另外,我如何删除所有的无限值,以便在np.all(np.isfinite(X))中得到True?\n这是我尝试过的:\n

df = df.replace([np.inf, -np.inf], np.nan).dropna(how="all")

\n但是检查infinite仍然返回True。\n此外,.apply(lambda s: s[np.isfinite(s)].dropna()).count()与简单的df.shape给出的所有列的行数相同,这表明缺少无限值。但是为什么np.all(np.isfinite(df))返回True?

0
0 Comments

问题:无法从DataFrame中删除无限值

原因:由于np.nan不被视为有限值,所以无法通过dropna方法删除无限值。

解决方法:将np.nan替换为任何有限的数字,如下所示:

df.replace([np.inf, -np.inf], np.nan).dropna(subset=["col1", "col2"], how="all")

代码示例:

import pandas as pd
import numpy as np
df = pd.DataFrame(columns=list('ABC'))
df.loc[0] = [1,np.inf,-np.inf]
print df
print np.all(np.isfinite(df))
df_nan = df.replace([np.inf, -np.inf], np.nan).dropna(subset=df.columns, how="all")
print df_nan
print np.all(np.isfinite(df_nan))
df_0 = df.replace([np.inf, -np.inf], 0).dropna(subset=df.columns, how="all")
print df_0
print np.all(np.isfinite(df_0))

结果:

     A    B    C
0  1.0  inf -inf
False
     A   B   C
0  1.0 NaN NaN
False
     A    B    C
0  1.0  0.0  0.0
True

解释:代码中首先创建了一个包含无限值的DataFrame。然后通过replace方法将无限值替换为np.nan,再通过dropna方法删除包含无限值的行。最后打印出结果并使用np.all(np.isfinite(df))检查结果是否包含有限值。

问题的提出者问道:和我在问题中发布的代码有何不同?这正是我尝试过的,但没有生效。

解释:不完全相同的原因是.dropna(subset=["col1", "col2"], how="all") != .dropna()。可以使用.dropna(subset=df.columns, how="all")来删除所有列。

最后,提出问题的人将自己Jupyter Notebook的截图添加到了问题中,并得到了确认可以使用subset=df.columns的回答。

0