【问题标题】:How do I create a "not" filter in python for pandas如何在 python 中为 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,谢谢!

标签: python python-2.7 pandas


【解决方案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)]
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-05-08
        • 1970-01-01
        • 2012-12-13
        • 1970-01-01
        • 1970-01-01
        • 2017-07-31
        • 2017-07-18
        相关资源
        最近更新 更多