【问题标题】:Bug: impossible to delete infinite values from DataFrame错误:无法从 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?

【问题讨论】:

    标签: python pandas


    【解决方案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
    猜你喜欢
    • 2021-05-09
    • 2020-05-19
    • 1970-01-01
    • 2011-02-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-02
    • 2013-11-28
    相关资源
    最近更新 更多