过滤值小于 0 的 pandas 数据帧的行

Posted

技术标签:

【中文标题】过滤值小于 0 的 pandas 数据帧的行【英文标题】:Filter rows of pandas dataframe whose values are lower than 0 【发布时间】: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 列,但我的数据集中有更多列,所以我无法一一进行。

【问题讨论】:

这就是你要找的df.loc[(df>0).all(axis=1) | df.isnull().any(axis=1)] 是的,如果我将 df 更改为 df[cols] ***.com/questions/13851535/… 【参考方案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

【讨论】:

以上是关于过滤值小于 0 的 pandas 数据帧的行的主要内容,如果未能解决你的问题,请参考以下文章

在 Pandas 数据框中按组过滤具有最小值的行 [重复]

按时间戳列过滤/选择熊猫数据帧的行

过滤多索引数据集(python/pandas)

Pandas,用于布尔索引的 loc 与非 loc

过滤“pandas”中所有不包含字母(alpha)的行

如何从 Pandas 数据框中过滤包含字符串模式的行 [重复]