Python 如何按Pandas中的数据帧分组并保留列

Python 如何按Pandas中的数据帧分组并保留列,python,pandas,Python,Pandas,给定一个数据框,记录一些书籍的使用情况,如下所示: 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 如何做到这一点

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

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
如何做到这一点


谢谢

您需要以下内容:

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”列在值中匹配,因此我们可以在这些值上调用,然后单击

另一种方法是使用
transform
添加“Count”列,然后调用
drop\u 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

我认为as_index=False应该可以解决这个问题

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

如果df中有许多列,那么使用
df.groupby(['foo']).agg(…)
是有意义的,请参阅。
.agg()
函数允许您选择如何处理不希望对其应用操作的列。如果您只想保留它们,可以使用
.agg({'col1':'first','col2':'first',…}
。而不是
'first'
,您还可以应用
'sum'
'mean'
和其他方法。

这似乎可行,但如果我们有更多的列(如我在其他数据框架中所做的那样),这不会影响性能吗?而且,这不是很直观。这里的问题是分组将减少信息量,因此不一定能一次性生成所需的df,我已更新了我的答案,以说明如何分两步完成,这更容易理解。这是最简单的答案,适用于其他摘要统计数据。