【问题标题】:How to implement a Boolean search with multiple columns in pandas如何在 pandas 中实现多列的布尔搜索
【发布时间】:2014-03-20 22:23:36
【问题描述】:

我有一个 pandas df,并希望按照以下方式完成一些事情(用 SQL 术语):

SELECT * FROM df WHERE column1 = 'a' OR column2 = 'b' OR column3 = 'c' etc.

现在这适用于一个列/值对:

foo = df.loc[df['column']==value]

但是,我不确定如何将其扩展到多个列/值对。

  • 需要明确的是,每一列都匹配不同的值。

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    由于运算符优先级,您需要将多个条件括在大括号中,并使用按位和 (&) 或 (|) 运算符:

    foo = df[(df['column1']==value) | (df['columns2'] == 'b') | (df['column3'] == 'c')]
    

    如果您使用andor,那么pandas 很可能会抱怨比较模棱两可。在这种情况下,不清楚我们是否在比较条件中一系列中的每个值,如果只有 1 或除 1 之外的所有值都符合条件,这意味着什么。这就是为什么您应该使用按位运算符或 numpy np.allnp.any 来指定匹配条件的原因。

    还有查询方法:http://pandas.pydata.org/pandas-docs/dev/generated/pandas.DataFrame.query.html

    但有一些限制主要与列名和索引值之间可能存在歧义的问题有关。

    【讨论】:

    • 或 df[(df.column1 > 0.5) & (df.column2 > 1.2) ]
    【解决方案2】:

    一种更简洁(但不一定更快)的方法是使用DataFrame.isin()DataFrame.any()

    In [27]: n = 10
    
    In [28]: df = DataFrame(randint(4, size=(n, 2)), columns=list('ab'))
    
    In [29]: df
    Out[29]:
       a  b
    0  0  0
    1  1  1
    2  1  1
    3  2  3
    4  2  3
    5  0  2
    6  1  2
    7  3  0
    8  1  1
    9  2  2
    
    [10 rows x 2 columns]
    
    In [30]: df.isin([1, 2])
    Out[30]:
           a      b
    0  False  False
    1   True   True
    2   True   True
    3   True  False
    4   True  False
    5  False   True
    6   True   True
    7  False  False
    8   True   True
    9   True   True
    
    [10 rows x 2 columns]
    
    In [31]: df.isin([1, 2]).any(1)
    Out[31]:
    0    False
    1     True
    2     True
    3     True
    4     True
    5     True
    6     True
    7    False
    8     True
    9     True
    dtype: bool
    
    In [32]: df.loc[df.isin([1, 2]).any(1)]
    Out[32]:
       a  b
    1  1  1
    2  1  1
    3  2  3
    4  2  3
    5  0  2
    6  1  2
    8  1  1
    9  2  2
    
    [8 rows x 2 columns]
    

    【讨论】:

      【解决方案3】:

      @EdChum 在 2014 年所做的所有考虑仍然有效,但 pandas.Dataframe.ix 方法从 pandas 0.0.20 版本开始已弃用。直接来自docs

      警告:从 0.20.0 开始,不推荐使用 .ix 索引器,取而代之的是 更严格的 .iloc 和 .loc 索引器。

      在 pandas 的后续版本中,此方法已被新的 indexing 方法 pandas.Dataframe.locpandas.Dataframe.iloc 取代。

      如果您想了解更多信息,请在this 帖子中找到上述方法之间的比较。

      最终,到目前为止(从这个角度来看,即将发布的熊猫版本似乎没有任何变化),这个问题的答案如下:

      foo = df.loc[(df['column1']==value) | (df['columns2'] == 'b') | (df['column3'] == 'c')]
      

      【讨论】:

        【解决方案4】:

        query() 方法可以非常直观地做到这一点。在要评估的字符串中表达您的条件,如下例所示:

        df = df.query("columnNameA <= @x or columnNameB == @y")
        

        x 和 y 是声明的变量,你可以用 @ 引用它们

        【讨论】:

          【解决方案5】:

          最简单的方法

          如果这有帮助,请点击向上箭头!塔恩克斯!!

          students = [ ('jack1', 'Apples1' , 341) ,
                       ('Riti1', 'Mangos1'  , 311) ,
                       ('Aadi1', 'Grapes1' , 301) ,
                       ('Sonia1', 'Apples1', 321) ,
                       ('Lucy1', 'Mangos1'  , 331) ,
                       ('Mike1', 'Apples1' , 351),
                        ('Mik', 'Apples1' , np.nan)
                        ]
          #Create a DataFrame object
          df = pd.DataFrame(students, columns = ['Name1' , 'Product1', 'Sale1']) 
          print(df)
          
          
              Name1 Product1  Sale1
          0   jack1  Apples1    341
          1   Riti1  Mangos1    311
          2   Aadi1  Grapes1    301
          3  Sonia1  Apples1    321
          4   Lucy1  Mangos1    331
          5   Mike1  Apples1    351
          6     Mik  Apples1    NaN
          
          # Select rows in above DataFrame for which ‘Product’ column contains the value ‘Apples’,
          subset = df[df['Product1'] == 'Apples1']
          print(subset)
          
           Name1 Product1  Sale1
          0   jack1  Apples1    341
          3  Sonia1  Apples1    321
          5   Mike1  Apples1    351
          6     Mik  Apples1    NA
          
          # Select rows in above DataFrame for which ‘Product’ column contains the value ‘Apples’, AND notnull value in Sale
          
          subsetx= df[(df['Product1'] == "Apples1")  & (df['Sale1'].notnull())]
          print(subsetx)
              Name1   Product1    Sale1
          0   jack1   Apples1      341
          3   Sonia1  Apples1      321
          5   Mike1   Apples1      351
          
          # Select rows in above DataFrame for which ‘Product’ column contains the value ‘Apples’, AND Sale = 351
          
          subsetx= df[(df['Product1'] == "Apples1")  & (df['Sale1'] == 351)]
          print(subsetx)
          
             Name1 Product1  Sale1
          5  Mike1  Apples1    351
          
          # Another example
          subsetData = df[df['Product1'].isin(['Mangos1', 'Grapes1']) ]
          print(subsetData)
          
          Name1 Product1  Sale1
          1  Riti1  Mangos1    311
          2  Aadi1  Grapes1    301
          4  Lucy1  Mangos1    331
          
          

          这是我找到的原始链接。我稍微修改了一下——https://thispointer.com/python-pandas-select-rows-in-dataframe-by-conditions-on-multiple-columns/

          【讨论】:

            猜你喜欢
            • 2010-10-10
            • 2018-08-18
            • 2013-06-17
            • 1970-01-01
            • 2014-03-30
            • 1970-01-01
            • 2018-02-03
            • 1970-01-01
            • 2020-05-18
            相关资源
            最近更新 更多