这是对该问题的扩展,OP希望知道如何删除单列值为NaN的行。
我想知道如何删除2(或更多)列中的值均为NaN的行。使用第二个答案的创建的数据框:
In [1]: df = pd.DataFrame(np.random.randn(10,3))
In [2]: df.ix[::2,0] = np.nan; df.ix[::4,1] = np.nan; df.ix[::3,2] = np.nan;
In [3]: df
Out[3]:
0 1 2
0 NaN NaN NaN
1 2.677677 -1.466923 -0.750366
2 NaN 0.798002 -0.906038
3 0.672201 0.964789 NaN
4 NaN NaN 0.050742
5 -1.250970 0.030561 -2.678622
6 NaN 1.036043 NaN
7 0.049896 -0.308003 0.823295
8 NaN NaN 0.637482
9 -0.310130 0.078891 NaN
如果我使用drop.na()
命令,特别是使用drop.na(subset=[1,2])
,那么它将完成一个“或”类型的放置并离开:
In[4]: df.dropna(subset=[1,2])
Out[4]:
0 1 2
1 2.677677 -1.466923 -0.750366
2 NaN 0.798002 -0.906038
5 -1.250970 0.030561 -2.678622
7 0.049896 -0.308003 0.823295
我想要的是一个“和”类型放置,它将放置行NaN
内的列索引为1和2的行删除。这将留下:
0 1 2
1 2.677677 -1.466923 -0.750366
2 NaN 0.798002 -0.906038
3 0.672201 0.964789 NaN
4 NaN NaN 0.050742
5 -1.250970 0.030561 -2.678622
6 NaN 1.036043 NaN
7 0.049896 -0.308003 0.823295
8 NaN NaN 0.637482
9 -0.310130 0.078891 NaN
仅删除第一行的位置。
有任何想法吗?
编辑:更改数据框值以保持一致性
以下两个中的任何一个:
df.dropna(subset=[1, 2], how='all')
或者
df.dropna(subset=[1, 2], thresh=1)
现在我觉得自己是个白痴,应该早点接受...谢谢!
如果我只想删除NAN行,如果2个(或更多)连续行具有NAN值,它如何工作?但是,必须保留具有NAN的单行(上方和下方的行不包含NAN)。
@zeniapy我认为您必须使用具有
df.iterrows()
每一个nan值的每一行来遍历数据框,检查之前和之后的2个条目,如果这些条目也具有nan值,则删除当前行。