【问题标题】:Filter rows of pandas dataframe whose values are lower than 0过滤值小于 0 的 pandas 数据帧的行
【发布时间】:2016-03-18 12:38:17
【问题描述】:

我有一个这样的熊猫数据框

df = pd.DataFrame(data=[[21, 1],[32, -4],[-4, 14],[3, 17],[-7,NaN]], columns=['a', 'b'])
df

我希望能够删除 列列表 中所有具有负值的行,并使用 NaN 保留行。

在我的示例中只有 2 列,但我的数据集中有更多列,所以我无法一一进行。

【问题讨论】:

标签: python pandas


【解决方案1】:

如果要将其应用于所有列,请使用 df[df > 0]dropna()

>>> df[df > 0].dropna()
    a   b
0  21   1
3   3  17

如果您知道要将其应用到哪些列,则仅对带有df[df[cols] > 0] 的列执行:

>>> cols = ['b']
>>> df[cols] = df[df[cols] > 0][cols]
>>> df.dropna()
    a   b
0  21   1
2  -4  14
3   3  17

【讨论】:

  • 就我而言,并非所有列都只是一个子集
  • @dooms 我又做了一次更新,请查看最新版本
  • @dooms 你遇到错误了吗?或意外的输出?能详细一点吗?
  • (我已经更新了我的问题)如果我使用 cols=['b'] 这也会删除我的数据框的最后一行,这不是我想要的
【解决方案2】:

我发现你可以通过这样做来简化答案:

>>> cols = ['b']
>>> df = df[df[cols] > 0]

dropna() 不是就地方法,所以你必须存储结果。

>>> df = df.dropna()

【讨论】:

  • 此代码导致一个空数据框,因为列 'a' 将被所有 NaN 替换,因为过滤器不包括该列。我可以修改这个答案以包含它,但它与其他答案几乎相同。
【解决方案3】:

我一直在寻找一种不会改变 dtype 的解决方案(如果 NaN 与使用 dropna 的答案中建议的整数混合,就会发生这种情况。因为提问者的数据中已经有一个 NaN ,这对他们来说可能不是问题。我采用了保留 int64 dtype 的解决方案。这是我的示例数据:

df = pd.DataFrame(data={'a':[0, 1, 2], 'b': [-1,0,1], 'c': [-2, -1, 0]})
columns = ['b', 'c']
filter_ = (df[columns] >= 0).all(axis=1)
df[filter_]


   a  b  c
2  2  1  0

【讨论】:

    猜你喜欢
    • 2021-09-30
    • 1970-01-01
    • 1970-01-01
    • 2019-01-06
    • 2019-01-02
    • 1970-01-01
    • 2019-08-17
    • 2022-11-10
    • 1970-01-01
    相关资源
    最近更新 更多