Python Pandas 查找所有值为 NaN 的所有行

Posted

技术标签:

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

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

nan = pd.isnull(df.all)

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

【问题讨论】:

【参考方案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://***.com/a/14033137/6664393

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

【讨论】:

以上是关于Python Pandas 查找所有值为 NaN 的所有行的主要内容,如果未能解决你的问题,请参考以下文章

Python/Pandas:计算每行中缺失/NaN 的数量

查找具有 NaN 值的 DataFrame 列表的索引 - Pandas

无法在pandas中通过lambda填充多列中的NaN值

仅在特定条件下将 NaN 替换为“-”符号,Python-Pandas

pandas 将数据框与 NaN(或“未知”)合并以查找缺失值

Python Pandas 将字符串转换为 NaN