繁体   English   中英

为什么我不能使用 np.isnan 过滤 dataframe?

[英]why i cant use np.isnan to filter dataframe?

我有一些数据框,其中包含很多 nan。

我想用第一个 dataframe 制作一个掩码,然后只保留第一个数据名中不包含 np.nan 的那些列。

让我举个例子:

In [69]: df = pd.DataFrame(np.reshape(range(25), (5,5)))

In [70]: df
Out[70]: 
    0   1   2   3   4
0   0   1   2   3   4
1   5   6   7   8   9
2  10  11  12  13  14
3  15  16  17  18  19
4  20  21  22  23  24

In [71]: df[5] = np.nan

In [72]: df
Out[72]: 
    0   1   2   3   4   5
0   0   1   2   3   4 NaN
1   5   6   7   8   9 NaN
2  10  11  12  13  14 NaN
3  15  16  17  18  19 NaN
4  20  21  22  23  24 NaN
### the following is the mask
In [73]: np.isnan(df)
Out[73]: 
       0      1      2      3      4     5
0  False  False  False  False  False  True
1  False  False  False  False  False  True
2  False  False  False  False  False  True
3  False  False  False  False  False  True
4  False  False  False  False  False  True

In [74]: df[~np.isnan(df)]
Out[74]: 
    0   1   2   3   4   5
0   0   1   2   3   4 NaN
1   5   6   7   8   9 NaN
2  10  11  12  13  14 NaN
3  15  16  17  18  19 NaN
4  20  21  22  23  24 NaN

你可以看到,我使用 np.isnan 创建一个面具。 然后使用df[mask]过滤。

但它看起来失败了,output 仍然包含第 5 列。 有什么我用错了吗?

编辑:

如果下面的任何解决方案都没有工作,则意味着没有缺失值,只有字符串nan s 而不是np.nan s。

所以可能的解决方案是替换它们:

df = df.replace('nan', np.nan)

您可以使用它,但不能通过它过滤,需要系列或一维掩码添加DataFrame.all用于测试 ig 没有值是每行缺失值(也添加~用于反转掩码)。

因此,对于没有NaN的过滤器行,请使用:

df[~np.isnan(df).all(axis=1)]

顺便说一句,在 pandas 中它更简单 - 删除每行至少有一个 NaN 的所有行:

df = df.dropna()

如果需要过滤具有至少一个NaN的行:

df[np.isnan(df).any(axis=1)]

因为您不能在元素方法中使用 map 矩阵...您可以删除行或列:

df[~np.isnan(df).all(axis=1)]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM