Bug: 无法从DataFrame中删除无限值。
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?
问题:无法从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的回答。