当所有单元格为零或 nan 时删除所有行

drop all rows when all cells are either zero or nan

当该行的每一列中的所有单元格都为 0 或 'nan' 时,我需要从数据框中删除所有行(ID 列除外,它将是一些唯一值) 我试过下面的命令但没有运气。 预期的输出也粘贴在下面。 提前致谢!

数据

df = pd.DataFrame({'id':[1,2,3,4],'a':[0,0,0,1], 'b':[0,1,'nan',1], 'c':['nan',1,0,1]})

    id  a   b   c
0   1   0   0   nan
1   2   0   1   1
2   3   0   nan 0
3   4   1   1   1

命令

df.loc[df[(df != 0) & (df != ('nan'))].all(axis=1)]

预期输出

    id  a   b   c
0   2   0   1   1
1   4   1   1   1

您的解决方案应更改为 select 所有列而不是第一个 DataFrame.all:

df1 = df.iloc[:, 1:]
df2 = df[(df1 != 0).all(axis=1) | (df1 != 'nan').all(axis=1)]

DataFrame.isin一样工作:

df2 = df[~df.iloc[:, 1:].isin([0, 'nan']).all(axis=1)]

如果 NaN 缺少值,则需要通过 DataFrame.notna:

测试它们
df1 = df.iloc[:, 1:]
df2 = df[(df1 != 0).all(axis=1) | df1.notna().all(axis=1)]

或:

df2 = df[~df.iloc[:, 1:].fillna('nan').isin([0, 'nan']).all(axis=1)]

使用您展示的示例,请尝试执行以下操作。使用 Pandas.

drop, isin 函数
df[~df.drop('id', 1).isin([0,'nan']).all(1)]

输出如下:

   id  a  b  c
1  2   0  1  1 
3  4   1  1  1

解释:

  • df.drop('id', 1).isin([0,'nan']).all(1):使用 drop 函数在轴 1 处放置以放置列 id,然后检查其值是否存在于 0 或 nan 中,然后使用 all 检查是否所有值都是TRUE 然后给出 true.
  • 然后使用 ~ 反转上述掩码的输出以获得 DataFrame 的预期输出。