Pandas分组对象筛选

9
我有一个pandas数据帧。
df.columns
Index([u’car_id’,u’color’,u’make’,u’year’)]

我想创建一个可过滤的新对象,该对象包含每个组(颜色,制造商,年份)的计数;
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’)

我收到了这个错误

类型错误:'function'对象不可迭代

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

2个回答

14

我认为你需要使用reset_index,然后输出为DataFrame。最后使用布尔索引

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


df1 = df[df.color == 'black']

1
这正是我需要的。我之前不知道(reset_index)部分。谢谢! - chattrat423

3

选项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
@chattrat423 jezrael的回答非常完美。这只是为了添加其他选择。 - piRSquared
明白了。我之前也不知道 pandas 中有 (xs) 方法。这是一个很好的补充。 - chattrat423

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接