如何在Pandas中对数据框进行分组并保留列?

125

给定一个记录书籍使用情况的数据框,如下所示:

Name   Type   ID
Book1  ebook  1
Book2  paper  2
Book3  paper  3
Book1  ebook  1
Book2  paper  2

我需要获取所有书的数量,同时保留其他列,得到以下结果:

Name   Type   ID    Count
Book1  ebook  1     2
Book2  paper  2     2
Book3  paper  3     1

这该如何实现呢?

谢谢!

5个回答

131
您希望以下内容:

In [20]:
df.groupby(['Name','Type','ID']).count().reset_index()

Out[20]:
    Name   Type  ID  Count
0  Book1  ebook   1      2
1  Book2  paper   2      2
2  Book3  paper   3      1

在您的情况下,“Name”、“Type”和“ID”列的值匹配,因此我们可以根据这些列进行groupby,调用count,然后reset_index

另一种方法是使用transform添加“Count”列,然后调用drop_duplicates

In [25]:
df['Count'] = df.groupby(['Name'])['ID'].transform('count')
df.drop_duplicates()

Out[25]:
    Name   Type  ID  Count
0  Book1  ebook   1      2
1  Book2  paper   2      2
2  Book3  paper   3      1

3
这似乎有效,但如果我们有更多的列(就像我在其他数据框中拥有的那样),这会影响性能吗?而且,这并不是很直观。 - Adrian Ribao
2
这里的问题在于分组会减少信息量,因此不一定能一次性得到您想要的数据框。我已经更新了我的答案,展示了如何通过两个步骤来完成,更易于理解。 - EdChum

121

我认为as_index=False可以解决问题。

df.groupby(['Name','Type','ID'], as_index=False).count()

3
这是最简单的答案,适用于其他摘要统计数据。 - Michael McFarlane

32
如果您的数据框中有许多列,使用df.groupby(['ID']).agg(Count=('ID', 'count'),...)是有意义的,详见这里.agg()函数允许您选择对不想应用操作的列要执行的操作。如果您只想保留它们(或更准确地说,保留它们中的第一个条目),请使用.agg(Count=('ID', 'count'), col1=('col1', 'first'), col2=('col2', 'first'),...)。除了'first',您还可以应用'sum''mean'和其他操作。

我使用这个,因为它可以给新计算列自定义名称。 - Steve Scott
@SteveScott,我之前不知道可以给新列自定义名称的选项。你能提供一个例子吗?我肯定会使用它,我经常回来查找确切的语法。 - NeStack
4
@NeStack.agg(col1_sum=('col1', 'sum'), col2_avg=('col2', 'mean')) - Umer

2

最简单的方法

df.groupby(['col1', 'col1'], as_index=False).count()。使用as_index=False保留列名。默认值为True

您还可以使用df.groupby(['col_1', 'col_2']).count().reset_index()


最佳答案!非常感谢 - v010dya

0

你也可以使用 value_counts()

df.value_counts().reset_index(name= 'Count')

输出:

    Name   Type  ID  Count
0  Book1  ebook   1      2
1  Book2  paper   2      2
2  Book3  paper   3      1

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