【问题标题】:Python - Drop row if two columns are NaNPython - 如果两列是 NaN,则删除行
【发布时间】:2016-12-31 21:59:33
【问题描述】:

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

我想知道如何删除 2(或更多)列中的值both 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

只删除第一行。

有什么想法吗?

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

【问题讨论】:

    标签: python pandas dataframe


    【解决方案1】:

    以下两项中的任意一项:

    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 值。
    • 我使用的是 pandas 1.1.5,我得到了:supplying multiple axes to axis is no longer supported.
    • 没关系。如果我添加subset= 那么它就可以了。谢谢。
    【解决方案2】:

    指定dropna()方法:

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

    【讨论】:

      【解决方案3】:

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

      df.dropna(subset=['col1', 'col2', 'col3', 'col4', 'col5', 'col6'], how='all', inplace=True)
      

      编辑:我认为它不起作用,因为“all”指的是df 中的所有列,而不是subset 中的所有列。 thresh 对我来说也有点令人困惑,因为它是保留行的条件,即使这是一个删除功能。在 OP 中,如果我理解正确,则需要至少有一个非 nan 值才能保留一行,如果一行有 2 个以上的 nan 值,则应将其删除。 就我而言,如果subset 的列中的所有值都有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=1axis='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)
      

      【讨论】:

        【解决方案4】:

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

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

        第二步:df.dropna(axis = 0, subset = col_lst, how = 'all', inplace = True)

        上述步骤仅从数据框中删除了那些包含从 7 到 45 的所有(不是任何)列且具有 NaN 值的行。

        【讨论】:

        • 分享一些代码来演示而不是干巴巴的词怎么样?
        【解决方案5】:

        试试下面这段代码,希望能解决你的问题

        drop_rows = df.dropna( how='any',
                                  subset=['Columns1', 'Columns2'])
        

        【讨论】:

          猜你喜欢
          • 2021-02-08
          • 2021-02-19
          • 2021-02-20
          • 1970-01-01
          • 2022-01-06
          • 1970-01-01
          • 1970-01-01
          • 2018-01-06
          • 2018-05-29
          相关资源
          最近更新 更多