【问题标题】:Drop all rows in pandas dataframe that are all only 0 or NA删除 pandas 数据框中只有 0 或 NA 的所有行
【发布时间】:2020-01-08 17:08:34
【问题描述】:

扩展 Drop rows with all zeros in pandas data frame,我将如何编辑该解决方案以从仅包含 0 和 NA 的数据框中删除所有行。

我试过了:

df.loc[~(df == 0 | df.isnan()).all(axis=1))]

但得到ValueError: The truth value of a Series is ambiguous.

编辑

df[(~(df == 0 | df.isna())).all(axis=1)] 适用于我的数据框之一,但不适用于以下数据:

df = pd.DataFrame({'x': {'Total': -3.637978807091713e-09}, 'y': {'Total': -3.637978807091713e-09}, 'z': {'Total': -3.637978807091713e-09}, 'a': {'Total': 0.0}, 'b': {'Total': 1387241.5974624965}, 'c': {'Total': 1387241.5974624965}})

当我运行 df[(~(df == 0 | df.isna())).all(axis=1)] 时,我得到一个空数据框,因为存在一个不等于 0 或 NA 的值,因此不应删除该行。

【问题讨论】:

  • 使用df.eq(0) 还是使用(df == 0) | ...

标签: python pandas na


【解决方案1】:

IIUC,你需要用括号括起来:

df[~((df==0)|(df.isna())).all(1)]

【讨论】:

  • 这似乎不适用于df = pd.DataFrame({'x': {'Total': -3.637978807091713e-09}, 'y': {'Total': -3.637978807091713e-09}, 'z': {'Total': -3.637978807091713e-09}, 'a': {'Total': 0.0}, 'b': {'Total': 1387241.5974624965}, 'c': {'Total': 1387241.5974624965}})
  • @cpage 我没明白你的意思,如果你想删除任何列而不是所有列中包含 0 或 NaN 的行,请将 all(1) 替换为 any(1)
  • df[(~(df == 0 | df.isna())).all(axis=1)] 在不应该删除的情况下删除该案例的一行,因为有一个 col 不是 0 或 NaN
  • @cpage 可能会更好,如果您可以编辑您的问题以说明为什么这不起作用
【解决方案2】:

我们可以使用摩根定律的逆逻辑来摆脱运算符~。 有时最好使用.mul 而不是& 以避免使用括号。

df[df.notna().mul(df.ne(0)).all(axis = 1)]
#df[(df.notna() & df.ne(0)).all(axis = 1)]

【讨论】:

    猜你喜欢
    • 2021-08-23
    • 1970-01-01
    • 2020-10-01
    • 2017-01-03
    • 2021-09-25
    • 1970-01-01
    • 2011-02-08
    • 1970-01-01
    相关资源
    最近更新 更多