Python 为什么我不能使用np.isnan来过滤数据帧?

Python 为什么我不能使用np.isnan来过滤数据帧?,python,pandas,Python,Pandas,我有一些数据帧,其中包含很多nan 我想通过第一个数据帧制作一个掩码,然后只保留那些在第一个数据帧中不包含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

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

我想通过第一个数据帧制作一个掩码,然后只保留那些在第一个数据帧中不包含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]
进行过滤

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

编辑:

如果不使用下面的任何解决方案,则表示没有缺失值,只有字符串
nan
s和非
np.nan
s

因此,可能的解决方案是替换它们:

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

您可以使用它,但不能按它过滤,需要为测试ig添加序列或1d掩码每行没有缺少值(也为反转掩码添加了
~

因此,对于没有
NaN
s的筛选器行,请使用:

df[~np.isnan(df).all(axis=1)]
顺便说一句,在pandas中更简单-删除每行至少有一个NaN的所有行:

df = df.dropna()

如果需要使用至少一个
NaN
筛选行:

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

如果不使用下面的任何解决方案,则表示没有缺失值,只有字符串
nan
s和非
np.nan
s

因此,可能的解决方案是替换它们:

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

您可以使用它,但不能按它过滤,需要为测试ig添加序列或1d掩码每行没有缺少值(也为反转掩码添加了
~

因此,对于没有
NaN
s的筛选器行,请使用:

df[~np.isnan(df).all(axis=1)]
顺便说一句,在pandas中更简单-删除每行至少有一个NaN的所有行:

df = df.dropna()

如果需要使用至少一个
NaN
筛选行:

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

因为你们不能用元素方法映射矩阵。。。您可以删除行或列:

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

因为你们不能用元素方法映射矩阵。。。您可以删除行或列:

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

嗯,我在python中尝试过,似乎仍然保留了这些值。在列中可能有许多值不是nan。。。看看jezreal在使用
any()
hmm时给出的强大答案,我在python中尝试过,似乎仍然保留了这些值。这里可能有许多列中没有nan的值。。。看看jezreal关于使用
any()