删除列仅包含 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
我有以下数据帧列表。我需要从每个 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