根据熊猫中的多个条件对行进行分组和过滤

时间:2020-06-20 13:39:22

标签: python-3.x pandas filter group-by

给出如下数据框:

store_id item_id  items_sold        date
1          1          0        2015-12-28
1          1          1        2015-12-28
1          1          0        2015-12-28
2          2          0        2015-12-28
2          2          1        2015-12-29
2          2          1        2015-12-29
2          2          0        2015-12-29
3          1          0        2015-12-30
3          1          0        2015-12-30

我要对store_iditem_id进行分组,然后为每个组删除其条目数少于4的条目,并且items_sold的所有值均为{{1} } s。

要删除基于第一个条件的组,我使用了以下代码,现在如何添加和组合第二个条件?

0

预期输出将为:

g = df.groupby(['store_id', 'item_id'])
df = g.filter(lambda x: len(x) >= 4)

谢谢。

2 个答案:

答案 0 :(得分:4)

我们可以使用items_sold = 0得到所有行的布尔数组,然后对该数组进行groupby并检查all的行是否为True

m1 = ~df['items_sold'].eq(0).groupby([df['store_id'], df['item_id']]).transform('all')
m2 = df.groupby(['store_id', 'item_id'])['store_id'].transform('size') >= 4

df[m1 & m2]

   store_id  item_id  items_sold        date
3         2        2           0  2015-12-28
4         2        2           1  2015-12-29
5         2        2           1  2015-12-29
6         2        2           0  2015-12-29

答案 1 :(得分:1)

修正您的代码

g.filter(lambda x: (len(x) >= 4) & (sum(x['items_sold'])>0))
   store_id  item_id  items_sold        date
3         2        2           0  2015-12-28
4         2        2           1  2015-12-29
5         2        2           1  2015-12-29
6         2        2           0  2015-12-29