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

Python-如果两列为NaN,则删除行,python,pandas,dataframe,Python,Pandas,Dataframe,这是对的扩展,OP想知道如何删除单个列中的值为NaN的行 我想知道如何删除2(或更多)列中的值都的行。使用第二个答案创建的数据框: 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

这是对的扩展,OP想知道如何删除单个列中的值为NaN的行

我想知道如何删除2(或更多)列中的值都的行。使用第二个答案创建的数据框:

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()

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
我想要的是一个“and”类型的drop,它在索引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
其中仅删除第一行

有什么想法吗


编辑:更改一致性的数据帧值

以下两个选项之一:

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

指定方法:


被接受的答案对我不起作用。我尝试了下面的代码,但在我的数据帧中没有任何更改

df.dropna(subset=['col1', 'col2', 'col3', 'col4', 'col5', 'col6'], how='all', inplace=True)
EDIT:我认为它不起作用,因为“all”指的是
df
中的所有列,而不是
子集中的所有列。
thresh
对我来说也有点混乱,因为它是保留行的条件,即使这是一个删除函数。在OP中,如果我理解正确,则要求至少有一个非nan值来保留一行,如果一行有两个以上的nan值,则应将其删除。 在我的例子中,如果
子集的列中的所有值都是nan值,我想删除一行,因此如果所有6个值都不是nan值,我想保留一行,我不知道这是否对应于
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
,我要传递的列列表不在数据帧中,我不知道原因

我最终像这样迭代了
df
,这也是因为我意识到一些假定的NaN值可能不会被捕获,因为它们是Null或空的:

indices_to_drop = list()
for index, row in df.iterrows():
        if (pd.isnull(row["col1"]) or pd.isna(row["col1"]) or row["col1"] == "") and \
                (pd.isnull(row["col2"]) or pd.isna(row["col2"]) or row["col2"] == "") and \
                (pd.isnull(row["col3"]) or pd.isna(row["col3"]) or row["col3"]
                 == "") and \
                (pd.isnull(row["col4"]) or pd.isna(row["col4"]) or row["col4"] ==
                 "") \
                and \
                (pd.isnull(row["col5"]) or pd.isna(row["col5"]) or row[
                    "col6"] == "") and \
                (pd.isnull(row["col6"]) or pd.isna(row["col6"]) or row["col6"] == ""):
            indices_to_drop.append(index)
df.drop(labels=indices_to_drop, inplace=True)

我遇到了一个类似的问题,我选择了45个特性(列),只想删除具有
NaN
值的选定特性的行,例如第7列到第45列

步骤1:我创建了一个列表(
col_lst
),它来自我想要为
NaN

第二步:
df.dropna(axis=0,subset=col\u lst,how='all',inplace=True)


上面的步骤只从数据帧中删除了那些行,这些行包含从7到45的所有列(不是任何列),这些列的值都是
NaN
值。

现在我觉得自己像个白痴,应该学会了……谢谢!如果我只想删除NAN行,如果两个(或更多)连续行具有NAN值,它是如何工作的?但是,必须保留带有NAN的单行(上面和下面的行没有NAN)。@zeniapy我认为您必须使用
df.iterrows()
在数据帧上迭代,并且对于具有一些NAN值的每一行,检查前后两个条目,如果这些条目也有nan值,则删除当前行。共享一些代码以进行演示,而不是枯燥的单词如何?
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)
indices_to_drop = list()
for index, row in df.iterrows():
        if (pd.isnull(row["col1"]) or pd.isna(row["col1"]) or row["col1"] == "") and \
                (pd.isnull(row["col2"]) or pd.isna(row["col2"]) or row["col2"] == "") and \
                (pd.isnull(row["col3"]) or pd.isna(row["col3"]) or row["col3"]
                 == "") and \
                (pd.isnull(row["col4"]) or pd.isna(row["col4"]) or row["col4"] ==
                 "") \
                and \
                (pd.isnull(row["col5"]) or pd.isna(row["col5"]) or row[
                    "col6"] == "") and \
                (pd.isnull(row["col6"]) or pd.isna(row["col6"]) or row["col6"] == ""):
            indices_to_drop.append(index)
df.drop(labels=indices_to_drop, inplace=True)