删除列仅包含 NaN 或零的行

remove rows where columns contain only NaN or Zero

我有以下数据帧列表。我需要从每个 df 中删除包含 only 值 NaN or 零的行。我无法将所有零更改为 NaN,因为在其他列中,它们具有有效含义而不是反映 missing/not 数字信息。理想情况下,我想以这种格式组合命令 [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]

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

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]

其他选项

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