错误:无法从 DataFrame 中删除无限值

Posted

技术标签:

【中文标题】错误:无法从 DataFrame 中删除无限值【英文标题】:Bug: impossible to delete infinite values from DataFrame 【发布时间】:2018-12-07 17:56:30 【问题描述】:

这是我的数据框df:

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

当我检查df 时,我看到有一些无限值。

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

False 
True

NaN 和无穷大有什么区别?另外,如何在np.all(np.isfinite(X)) 中删除所有无限值以获取 True?

这是我尝试过的:

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

infinite 的检查仍然给我 True。

此外,.apply(lambda s: s[np.isfinite(s)].dropna()).count() 给我的所有列的行数与简单的df.shape 相同,这表明缺少无限值。但在这种情况下,为什么np.all(np.isfinite(df)) 返回 True?

【问题讨论】:

【参考方案1】:

您的问题类似于dropping infinite values from dataframes in pandas?, 你试过了吗:

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

np.nan 不被视为finite,您可以将np.nan 替换为任何有限的number,例如该代码:


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

【讨论】:

它与我在问题中发布的内容有何不同?这正是我尝试过的,但没有奏效。 不完全相同,因为:.dropna(subset=["col1", "col2"], how="all") != .dropna() 我应该提到所有的列吗?我可以.dropna(subset=df.columns, how="all")吗? 我在帖子中添加了 Jupyter Notebook 的屏幕截图。 是的,你可以这样做:subset=df.columns

以上是关于错误:无法从 DataFrame 中删除无限值的主要内容,如果未能解决你的问题,请参考以下文章

从 pandas DataFrame 中的多个字符串列中删除子字符串

Pyspark RDD 到具有强制模式的 DataFrame:值错误

根据列值有效地从宽 Spark Dataframe 中删除列

尝试从 Pandas DataFrame 中的字典访问第一个值时出现浮点错误

Swift 3:致命错误:Double 值无法转换为 Int,因为它是无限的或 NaN

PySpark DataFrame 无法删除重复项