【问题标题】:Pandas groupby object filteringPandas groupby 对象过滤
【发布时间】:2017-01-20 07:02:51
【问题描述】:

我有一个熊猫数据框

df.columns
Index([u’car_id’,u’color’,u’make’,u’year’)]

我想创建一个新的 FILTERABLE 对象,其中包含每个组的计数(颜色、品牌、年份);

grp = df[[‘color’,’make’,’year’]].groupby([‘color’,’make’,’year’]).size()

这将返回类似的东西

color   make   year     count
black   honda  2011   416

我希望能够过滤它,但是当我尝试这样做时:

grp.filter(lambda x: x[‘color’]==‘black’)

我收到此错误

TypeError: 'function' 对象不可迭代

如何利用“groupby”对象来过滤行?

【问题讨论】:

    标签: python pandas indexing group-by conditional-statements


    【解决方案1】:

    选项 1
    提前过滤

    cols = ['color','make','year']
    df[df.color == 'black', cols].grouby(cols).size()
    

    选项 2 索引横截面使用xs

    cols = ['color','make','year']
    grp = df[cols].groupby(cols).size()
    
    df.xs('black', level='color', drop_level=False)
    

    df.xs('honda', level='make', drop_level=False)
    

    df.xs(2011, level='year', drop_level=False)
    

    【讨论】:

    • 第一个选项会不必要地昂贵,因为它需要在每个过滤器请求时进行计算。然而,第二个选项确实有效,并且可以用作@jezrael 提出的方法的替代方法
    • @chattrat423 jezrael 的回答是完美的。这纯粹是为了添加替代品。
    • 明白。我也不知道 pandas 的 (xs) 方法。这是一个很好的补充
    【解决方案2】:

    我认为您需要添加reset_index,然后输出为DataFrame。最后使用boolean indexing

    df = df[['color','make','year']].groupby(['color','make','year'])
                                    .size()
                                    .reset_index(name='count')
    
    
    df1 = df[df.color == 'black']
    

    【讨论】:

    • 这正是我所需要的。我不知道 (reset_index) 部分。干杯
    猜你喜欢
    • 2019-02-06
    • 2018-07-22
    • 2013-07-10
    • 1970-01-01
    • 2022-11-18
    • 2023-03-29
    • 2016-02-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多