首页 > 解决方案 > 如何在多个条件下过滤数据框?

问题描述

我有以下数据框。

 import pandas as pd
    import numpy as np
    d ={
        'ID1':['abc1','abc2','abc3','abc4','abc5','abc1','abc1','abc1','abc1','abc1','abc2','abc2','abc2','abc3'],
        'Item':['orange','mango','jack','cucumber','banana','pineapple','sapota','grapes','papaya','watermelon','guava','pomogranate','mosambi','apple'],
        'Type':['A','B','A','B','A','B','A','B','A','B','A','B','A','B'],
        'Price':[25,30,15,20,25,30,15,20,25,30,15,20,25,30]
    }
    df = pd.DataFrame(data = d)
    df

对于 groupby 条件,以下是代码:

df.groupby('ID1').filter(lambda s: s.Price.sum()>=80).sort_values(by='ID1',ascending = True)

如何在以下多个条件下过滤 ID:

  1. 价格总和> 90 和
  2. 它应该有 3 倍 A 和 3 倍 B 作为 Type 和
  3. 2 id 的价格可以在 15、20 和
  4. 4 个 id 的价格可以大于或等于 25

预期输出:

    ID1     Item            Type    Price
0   abc1    orange              A   25
5   abc1    pineapple           B   30
6   abc1    sapota              A   15
7   abc1    grapes              B   20
8   abc1    papaya              A   25
9   abc1    watermelon          B   30

标签: pandas

解决方案


您可以使用GroupBy.transformwith sum- from 第二个条件来计算True每个条件的值 by Series.eqSeries.ge以及Series.between最后一个链条件 by&用于按位AND和过滤器boolean indexing

m1 = df.groupby('ID1')['Price'].transform('sum') > 90
m2 = df['Type'].eq('A').groupby(df['ID1']).transform('sum') == 3
m3 = df['Type'].eq('B').groupby(df['ID1']).transform('sum') == 3
m4 = df['Price'].between(15, 20).groupby(df['ID1']).transform('sum') == 2
m5 = df['Price'].ge(25).groupby(df['ID1']).transform('sum') == 4

或者:

m1 = df.groupby('ID1')['Price'].transform('sum').gt(90)
m2 = df['Type'].eq('A').groupby(df['ID1']).transform('sum').eq(3)
m3 = df['Type'].eq('B').groupby(df['ID1']).transform('sum').eq(3)
m4 = df['Price'].between(15, 20).groupby(df['ID1']).transform('sum').eq(2)
m5 = df['Price'].ge(25).groupby(df['ID1']).transform('sum').eq(4)

df = df[m1 & m2 & m3 & m4 & m5]
print (df)
    ID1        Item Type  Price
0  abc1      orange    A     25
5  abc1   pineapple    B     30
6  abc1      sapota    A     15
7  abc1      grapes    B     20
8  abc1      papaya    A     25
9  abc1  watermelon    B     30

推荐阅读