过滤值小于 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 数据帧的行的主要内容,如果未能解决你的问题,请参考以下文章