【问题标题】:remove rows where columns contain only NaN or Zero删除列仅包含 NaN 或零的行
【发布时间】:2021-08-21 09:40:50
【问题描述】:

我有以下数据框列表。我需要从每个 df 中删除包含 only 值 NaN 零的行。我无法将所有零更改为 NaN,因为在其他列中,它们具有有效含义,而不是反映缺失/不是数字信息。理想情况下,我想以这种格式组合命令 [x.dropna(axis=0, how='all') for x in dfs]。谢谢!

数据

df1 = pd.DataFrame(data={'id':[1,2,0,4,5,6], 
                         'a': [41,41,0,43,40,41], 
                         'b': [21,20,0,19,23,23],
                         'c': [0,0,0,0,43,0],
                         'd': [12,11,0,0,0,0]})

df2 = pd.DataFrame(data={'id':[0,2,0,4,5,6], 
                         'a': [0,41,0,43,40,41], 
                         'b': ['NaN',20,'NaN',19,23,23],
                         'c': [0,0,0,0,43,0],
                         'd': [0,11,0,0,0,0]})

df3 = pd.DataFrame(data={'id':[1,2,'NaN','NaN',5,0], 
                         'a': [41,41,0,43,40,0], 
                         'b': [21,20,0,19,23,0],
                         'c': [0,0,0,0,43,0],
                         'd': [12,11,0,0,0,0]})

dfs = [df1,df2,df3]

预期输出

[   id   a   b   c   d
 0   1  41  21   0  12
 1   2  41  20   0  11
 2   4  43  19   0   0
 3   5  40  23  43   0
 4   6  41  23   0   0,
    id   a   b   c   d
 0   2  41  20   0  11
 1   4  43  19   0   0
 2   5  40  23  43   0
 3   6  41  23   0   0,
     id   a   b   c   d
 0    1  41  21   0  12
 1    2  41  20   0  11
 2  NaN  43  19   0   0
 3    5  40  23  43   0
 4    0   0   0   0   0]

【问题讨论】:

    标签: python pandas subset drop


    【解决方案1】:

    您可以将 0 替换为缺失值,但如果boolean indexing 中至少存在一个非NaN 值,则最好通过这个替换的删除原始DataFrames 并测试所有行:

    dfs = [x[x.replace(0, np.nan).notna().any(axis=1)] for x in dfs]
    
    print (dfs)
    [   id   a   b   c   d
    0   1  41  21   0  12
    1   2  41  20   0  11
    3   4  43  19   0   0
    4   5  40  23  43   0
    5   6  41  23   0   0,    id   a     b   c   d
    1   2  41  20.0   0  11
    3   4  43  19.0   0   0
    4   5  40  23.0  43   0
    5   6  41  23.0   0   0,     id   a   b   c   d
    0  1.0  41  21   0  12
    1  2.0  41  20   0  11
    3  NaN  43  19   0   0
    4  5.0  40  23  43   0]
    

    如果只有正值,可以测试sum 是否不是0

    dfs = [x[x.sum(axis=1).ne(0)] for x in dfs]
    

    【讨论】:

      【解决方案2】:

      其他选项

      dfs = pd.concat([df1,df2,df3])
      dfs["sum"] = dfs.sum(axis=1)
      dfs = dfs.drop(dfs[dfs["sum"] == 0].index)
      dfs
      

      输出

          id  a   b   c   d   sum
      1   2   41  20  0   11  104
      3   4   43  19  0   0   86
      4   5   40  23  43  0   166
      1   2   41  20  0   11  104
      3   4   43  19  0   0   86
      4   5   40  23  43  0   166
      1   2   41  20  0   11  104
      3   NaN     43  19  0   0   86
      4   5   40  23  43  0   166
      

      【讨论】:

        猜你喜欢
        • 2014-02-05
        • 1970-01-01
        • 1970-01-01
        • 2023-03-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-11-23
        • 1970-01-01
        相关资源
        最近更新 更多