如何在 python 中为 pandas 创建一个“非”过滤器

Posted

技术标签:

【中文标题】如何在 python 中为 pandas 创建一个“非”过滤器【英文标题】:How do I create a "not" filter in python for pandas 【发布时间】:2016-09-26 09:33:15 【问题描述】:

我有一个已导入 pandas 的大型数据框,我想通过过滤器将其截断。这是我的基本示例代码:

import pandas as pd
import numpy as np
from pandas import Series, DataFrame

df = DataFrame('A':[12345,0,3005,0,0,16455,16454,10694,3005],'B':[0,0,0,1,2,4,3,5,6])

df2= df[df["A"].map(lambda x: x > 0) & (df["B"] > 0)]

基本上,这显示了半正确的后 4 个结果。但我需要显示除这些结果之外的所有内容。所以本质上,我正在寻找一种使用此过滤器的方法,但如果可能的话,使用“非”版本。因此,如果 A 列大于 0 并且 B 列大于 0,那么我们希望从数据框中取消这些值的资格。谢谢

【问题讨论】:

在此处阅读有关布尔掩码的文档:pandas.pydata.org/pandas-docs/stable/…。您可以将~ 用作“非”df2= df[~df["A"].map(lambda x: x > 0) & (df["B"] > 0)] 这是朝着正确方向迈出的一步,但它只给我留下了 2 条记录而不是 5 条 对不起,我贴的sn-p需要应用于整个蒙版,而不是第一个。 df[~(df["A"].map(lambda x: x > 0) & (df["B"] > 0))] 为什么不能反过来呢?如果 A 列小于 0 或 b 列小于 0 @Thomas Tu,谢谢! 【参考方案1】:

无需在“A”系列上调用地图函数。

申请De Morgan's Law:

“not (A and B)”与“(not A) or (not B)”相同

df2 = df[~(df.A > 0) | ~(df.B > 0)]

【讨论】:

【参考方案2】:

不需要map 实现。你可以颠倒参数,比如 ...

df.ix[(df.A<=0)|(df.B<=0),:]

或者使用boolean indexing而不使用ix

df[(df.A<=0)|(df.B<=0)]

【讨论】:

【参考方案3】:

试试

df2 = df[df["A"].map(lambda x: x <= 0) | (df["B"] <= 0)]

【讨论】:

以上是关于如何在 python 中为 pandas 创建一个“非”过滤器的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Pandas Python 中为一组主键分组填充 NA 值

在 Python 中为 pandas 对象添加月份

如何在 Python 中为 QTableWidget 设置大小提示

如何在pandas dataframe中为新列添加值?

如何在 pandas 中为 2 级参数取消透视

如何在Python中为现有类添加方法?