【问题标题】:Python Pandas find all rows where all values are NaNPython Pandas 查找所有值为 NaN 的所有行
【发布时间】:2016-12-17 11:52:32
【问题描述】:

所以我有一个包含 5 列的数据框。我想提取所有列都是 NaN 的索引。我正在使用此代码:

nan = pd.isnull(df.all)

但这只是返回 false,因为它在逻辑上说不是数据框中的所有值都为空。有成千上万的条目,所以我宁愿不必循环检查每个条目。谢谢!

【问题讨论】:

    标签: python python-2.7 pandas


    【解决方案1】:

    应该是:

    df.isnull().all(1)
    

    index 可以这样访问:

    df.index[df.isnull().all(1)]
    

    演示

    np.random.seed([3,1415])
    df = pd.DataFrame(np.random.choice((1, np.nan), (10, 2)))
    df
    

    idx = df.index[df.isnull().all(1)]
    nans = df.ix[idx]
    nans
    


    时间

    代码

    np.random.seed([3,1415])
    df = pd.DataFrame(np.random.choice((1, np.nan), (10000, 5)))
    

    【讨论】:

    • 太棒了!非常感谢!
    • 为什么是all(1)?我看到这是这个问题的正确答案,但我无法理解它。我们有一个 Trues 和 Falses 表,我们想要所有 只有(所有)True 值。那么为什么要查看列轴 (1) 而不是索引 (0)?
    • @Jinx all(1) 很有趣不是吗?如果您尝试简单的旧all(),或者更明确的all(axis=0),您会发现Pandas 会计算每列 的值。通过指定all(1),或更明确地指定all(axis=1),您正在检查所有值是否每行为空。有关更多详细信息,请参阅all 的文档
    【解决方案2】:

    假设您的数据框名为 df,您可以使用布尔索引来检查所有列 (axis=1) 是否为空。然后取结果的索引。

    np.random.seed(0)
    df = pd.DataFrame(np.random.randn(5, 3))
    df.iloc[-2:, :] = np.nan
    >>> df
              0         1         2
    0  1.764052  0.400157  0.978738
    1  2.240893  1.867558 -0.977278
    2  0.950088 -0.151357 -0.103219
    3       NaN       NaN       NaN
    4       NaN       NaN       NaN
    
    nan = df[df.isnull().all(axis=1)].index
    
    >>> nan
    Int64Index([3, 4], dtype='int64')
    

    【讨论】:

      【解决方案3】:

      来自大师本人:https://stackoverflow.com/a/14033137/6664393

      nans = pd.isnull(df).all(1).nonzero()[0]
      

      【讨论】:

        猜你喜欢
        • 2017-01-10
        • 1970-01-01
        • 2020-01-23
        • 1970-01-01
        • 2018-10-29
        • 2021-03-08
        • 2022-07-06
        • 2021-12-13
        • 1970-01-01
        相关资源
        最近更新 更多