如何在 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 值