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 对象过滤的主要内容,如果未能解决你的问题,请参考以下文章