代码之家  ›  专栏  ›  技术社区  ›  veg2020

按对象分组筛选:选择与满足特定条件的客户关联的所有行

  •  1
  • veg2020  · 技术社区  · 2 年前

    在这里的虚构数据中,我想确定在所有访问中没有购买酒精饮料(例如“啤酒”或“葡萄酒”)的任何客户。

    df = pd.DataFrame({"customer": ['A55', 'A55', 'A55', 
                           'B080', 'B080', 
                           'D900', 'D900', 
                           'Z900', 'Z900', 'Z900', 'Z900'],
                   "date":['01/11/2016', '01/21/2016', '02/11/2016', 
                           '08/17/2016', '6/17/2016',
                           '03/01/2016','04/30/2016', 
                           '05/16/2016','09/27/2016', '10/05/2016', '11/11/2016'],
                   "item": ['Beer', 'Beer', 'Wine', 
                            'Coffee', 'Gatorade', 
                            'Wine', 'Coffee', 
                            'Beer', 'Wine', 'Beer', 'Coffee']
    })
    
        ##Tag visit number for each customer
    df["customer_visit_number"] = df.groupby("customer").cumcount().add(1)
    
    

    在下面的数据框示例中,只有客户B080从未购买过任何啤酒或葡萄酒。相比之下,其他人偶尔或所有来访都会买啤酒或葡萄酒。为了标记客户访问量,我添加了cumcount()操作,但并非所有客户访问商店的次数都相同。

    在panda中,是否有一种简单的方法可以在客户级别执行groupby操作后过滤与该客户关联的所有行?

    请参阅下面的数据帧 enter image description here

    1 回复  |  直到 2 年前
        1
  •  2
  •   mozway    2 年前

    识别购买酒精饮料的客户:

    drop = (df['item'].isin(['Beer', 'Wine'])
            .groupby(df['customer']).any()
           )
    

    筛选器 boolean indexing :

    out = df[~df['customer'].isin(drop[drop].index)]
    

    或与 groupby.transform 要直接获取一系列布尔值用于布尔索引:

    m = (df['item'].isin(['Beer', 'Wine'])
         .groupby(df['customer'])
         .transform('any')
        )
    out = df[~m]
    

    输出:

      customer        date      item
    3     B080  08/17/2016    Coffee
    4     B080   6/17/2016  Gatorade
    

    中间体:

    # drop
    customer
    A55      True
    B080    False
    D900     True
    Z900     True
    Name: item, dtype: bool
    
    # m
    0      True
    1      True
    2      True
    3     False
    4     False
    5      True
    6      True
    7      True
    8      True
    9      True
    10     True
    Name: item, dtype: bool