[英]Potential bug in np.isnan() for mixed types on pandas 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.