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


73

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

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

如何才能做到这一点?

谢谢!

Answers:


81

您需要以下内容:

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

在您的情况下,“名称”,“类型”和“ ID”列的值匹配,因此我们可以groupby对它们进行调用count,然后单击reset_index

另一种方法是使用添加“ Count”列transform,然后调用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
这似乎可行,但是如果我们有更多的列(如我在其他数据帧中所拥有的),这是否会损害性能?另外,它也不是很直观。
阿德里安·里宝

1
这里的问题是,分组会减少信息量,因此不一定能一次性产生您想要的df。我更新了答案,以显示如何分两步完成,这更好理解
EdChum

71

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

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

3

如果df中有很多列,则可以使用df.groupby(['foo']).agg(...),请参见此处。该.agg()功能允许您选择对不想对其应用操作的列进行处理。如果只想保留它们,请使用.agg({'col1': 'first', 'col2': 'first', ...}。相反的'first',你也可以申请'sum''mean'和其他人。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.