Python - 如果两列是NaN,则删除行

时间:2016-08-24 16:43:13

标签: python pandas dataframe

这是this question的扩展,其中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

我想要的是“和”类型下拉,它会删除列索引1 2中NaN的行。这将留下:

          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

只删除第一行。

有什么想法吗?

编辑:更改数据框架值以保持一致性

4 个答案:

答案 0 :(得分:12)

以下两项中的任何一项:

df.dropna(subset=[1, 2], how='all')

df.dropna(subset=[1, 2], thresh=1)

答案 1 :(得分:3)

指定dropna()方法:

df.dropna(subset=[1,2], how='all')

答案 2 :(得分:0)

接受的答案对我不起作用。我尝试了以下代码,但数据框中没有任何变化。

yarn

编辑:我认为它不起作用,因为“全部”是指df.dropna(subset=['col1', 'col2', 'col3', 'col4', 'col5', 'col6'], how='all', inplace=True) 中的所有列,而不是df中的所有列。 subset也让我有些困惑,因为即使这是一个删除函数,它也是保留行的条件。在OP中,如果我理解正确,则必须至少具有一个非nan值才能保留一行,并且如果一行具有两个以上nan值,则应将其删除。 就我而言,如果thresh列中的所有值都具有nan值,我想删除一行,因此如果所有6个值都不是nan,我想保留一行,并且我不知道这是否对应于subset

这两个命令对我也不起作用:

thresh=6

,当我在参数中添加df.dropna(subset=['col1', 'col2', 'col3', 'col4', 'col5', 'col6'], thres=6, inplace=True) df.dropna(subset=['col1', 'col2', 'col3', 'col4', 'col5', 'col6'], how='all', thres=6, inplace=True) axis=1时,我得到了axis='columns',即我要传递的列列表不在数据框中,并且我不知道原因。

我最终像这样遍历KeyError,也是因为我意识到某些NaN值可能不会被捕获,因为它们为Null或为空:

df

答案 3 :(得分:0)

我遇到了类似的问题,我要设置45个要素(列),并希望仅删除具有NaN值的选定要素(例如第7列至第45列)的行。

步骤1:我从要为NaN操作的列中创建了一个列表(col_lst)

第2步:df.dropna(轴= 0,子集= col_lst,how ='all',inplace = True)

上面的步骤仅从数据框中删除了具有NaN值的所有(不包括)从7到45列的所有行。