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