【问题标题】:Pandas DataFrame to drop rows in the groupbyPandas DataFrame 在 groupby 中删除行
【发布时间】:2020-03-31 12:13:22
【问题描述】:

我有一个包含三列 DateAdvertiser 和 ID 的 DataFrame。我先将数据分组,看看是否某些 Advertisers 的数量太小(例如当count() 小于 500 时)。然后我想在组表中删除这些行。

df.groupby(['Date','Advertiser']).ID.count()

结果是这样的:

 Date         Advertiser
 2016-01        A             50000
                B               50
                C              4000
                D             24000
 2016-02        A              6800
                B              7800
                C               123
 2016-03        B              1111
                E              8600
                F               500

我希望结果是这样的:

 Date         Advertiser
 2016-01        A             50000
                C              4000
                D             24000
 2016-02        A              6800
                B              7800
 2016-03        B              1111
                E              8600

后续问题:

如果我想根据日期类别中的总 count() 过滤掉 groupby 中的行怎么样。比如我想count() 表示大于15000的日期,我要的表是这样的:

Date         Advertiser
 2016-01        A             50000
                B               50
                C              4000
                D             24000
 2016-02        A              6800
                B              7800
                C               123

【问题讨论】:

    标签: python pandas dataframe


    【解决方案1】:

    groupby 后面有一个 Series 对象,可以使用链式 lambda 过滤器根据值进行过滤:

    df.groupby(['Date','Advertiser']).ID.count()[lambda x: x >= 500]
    
    #Date     Advertiser
    #2016-01  A             50000
    #         C              4000
    #         D             24000
    #2016-02  A              6800
    #         B              7800
    #2016-03  B              1111
    #         E              8600
    #         F               500
    

    【讨论】:

    • 这绝对是我想要的。没想到可以这么轻松。我尝试使用 filter(lambda x: x.count()>500)。它似乎奏效了。然而事实并非如此。您能否解释一下为什么过滤功能不能正常工作?谢谢!
    • 我相信groupby.filter 如果您想将结果保留为数据框也应该可以工作,例如df.groupby(['Date', 'Advertiser']).filter(lambda g: g.ID.size >= 500)df.groupby(['Date', 'Advertiser']).filter(lambda g: g.ID.count() >= 500)。在您的情况下,x 是一个数据框,x.count() 返回一个系列,但您需要一个标量值来过滤组。
    • 这是有道理的。我有一个后续问题。您能否再添加一条评论?
    • 你可以试试这个df.groupby(['Date','Advertiser']).ID.count().groupby(level=0).filter(lambda x: x.sum() > 15000)分组,按索引的0级,即日期,然后根据计数的总和过滤。
    • 你可以使用groupby(level=[0,1])
    猜你喜欢
    • 2020-09-15
    • 2016-10-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多