我有一个数据集,我需要groupby()并找到每个唯一组合的计数。
body-style make
0 convertible alfa-romeo
1 convertible alfa-romeo
2 hatchback alfa-romeo
3 sedan audi
4 sedan audi
我需要产生如下所示的输出:
make body-style count
0 alfa-romero convertible 2
1 alfa-romero hatchback 1
2 audi sedan 2
尝试以下代码:
body = pd.DataFrame({'make':['alfa-romeo','alfa-romeo','alfa-romeo','audi','audi'], 'body-style':['convertible','convertible','hatchback','sedan','sedan']})
body.groupby(by=['make','body-style'], as_index=False).count()
此聚合会将" 列表索引超出范围"错误。但是,当我从groupby子句中删除任一列时,它能够为我提供按剩余列分组的计数。
如果我删除 as_index = False ,则没有错误,但结果对象将同时包含两列 - make 和 body-style 作为索引的一部分,并且赢得了任何计数数据。
我可以在数据框中添加另一列,用1填充它,然后在groupby上取sum()
而不是count()
。但是想知道是否有更清洁的方法来做到这一点。
答案 0 :(得分:6)
只有当您至少有一列未用于分组时,才能使用GroupBy.count()
。
如果您按DF中的所有列进行分组 - 请改为使用.size()
:
In [119]: body.groupby(['make','body-style']).size().reset_index(name='count')
Out[119]:
make body-style count
0 alfa-romeo convertible 2
1 alfa-romeo hatchback 1
2 audi sedan 2