【问题标题】:Groupby and filter rows based on multiple conditions in Pandas基于 Pandas 中的多个条件的 Groupby 和过滤行
【发布时间】:2020-10-10 16:05:25
【问题描述】:

给定一个数据框如下:

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 的所有值都是0s。

为了根据第一个条件删除组,我使用了下面的代码,现在如何添加第二个条件并将其与它组合?

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

预期的输出将是:

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

谢谢。

【问题讨论】:

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


    【解决方案1】:

    我们可以得到一个包含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
    

    【讨论】:

    • @ShubhamSharma 你可以点击说谢谢:-) 新功能:-)
    • @YOBEN_S 是的...:)
    【解决方案2】:

    修复你的代码

    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
    

    【讨论】:

    • 如果我还想删除非 NaN 值小于 30% 的其他列?
    • @ahbon g.filter(lambda x: (len(x) >= 4) & (sum(x['items_sold'])>0) & (sum(x['Other'].isna())/len(x)<0.3))
    • 非常感谢您的帮助 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-10-19
    • 1970-01-01
    • 2018-07-22
    • 2022-07-21
    • 1970-01-01
    • 1970-01-01
    • 2019-04-10
    相关资源
    最近更新 更多