【发布时间】:2016-12-17 11:52:32
【问题描述】:
所以我有一个包含 5 列的数据框。我想提取所有列都是 NaN 的索引。我正在使用此代码:
nan = pd.isnull(df.all)
但这只是返回 false,因为它在逻辑上说不是数据框中的所有值都为空。有成千上万的条目,所以我宁愿不必循环检查每个条目。谢谢!
【问题讨论】:
标签: python python-2.7 pandas
所以我有一个包含 5 列的数据框。我想提取所有列都是 NaN 的索引。我正在使用此代码:
nan = pd.isnull(df.all)
但这只是返回 false,因为它在逻辑上说不是数据框中的所有值都为空。有成千上万的条目,所以我宁愿不必循环检查每个条目。谢谢!
【问题讨论】:
标签: python python-2.7 pandas
应该是:
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)?
all(1) 很有趣不是吗?如果您尝试简单的旧all(),或者更明确的all(axis=0),您会发现Pandas 会计算每列 的值。通过指定all(1),或更明确地指定all(axis=1),您正在检查所有值是否每行为空。有关更多详细信息,请参阅all 的文档
假设您的数据框名为 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')
【讨论】:
来自大师本人:https://stackoverflow.com/a/14033137/6664393
nans = pd.isnull(df).all(1).nonzero()[0]
【讨论】: