给出如下数据框:
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_id
和item_id
进行分组,然后为每个组删除其条目数少于4
的条目,并且items_sold
的所有值均为{{1} } s。
要删除基于第一个条件的组,我使用了以下代码,现在如何添加和组合第二个条件?
0
预期输出将为:
g = df.groupby(['store_id', 'item_id'])
df = g.filter(lambda x: len(x) >= 4)
谢谢。
答案 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