Pandas groupby 对象过滤

Posted

技术标签:

【中文标题】Pandas groupby 对象过滤【英文标题】:Pandas groupby object filtering 【发布时间】: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”对象来过滤行?

【问题讨论】:

【参考方案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) 部分。干杯

以上是关于Pandas groupby 对象过滤的主要内容,如果未能解决你的问题,请参考以下文章

使用 groupby 的结果过滤 pandas 数据框

Pandas | 18 GroupBy 分组

如何在 pandas 中使用过滤条件和 groupby

在 Pandas 中过滤分组的 DataFrame

Pandas groupby,过滤并将输出放入列表中

Python pandas - 在 groupby 之后过滤行