如何在Pandas中组合数据框并保留列

Adr*_*bao 48 python pandas

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

Name   Type   ID
Book1  ebook  1
Book2  paper  2
Book3  paper  3
Book1  ebook  1
Book2  paper  2
Run Code Online (Sandbox Code Playgroud)

我需要得到所有书籍的数量,保留其他列并得到这个:

Name   Type   ID    Count
Book1  ebook  1     2
Book2  paper  2     2
Book3  paper  3     1
Run Code Online (Sandbox Code Playgroud)

如何才能做到这一点?

谢谢!

EdC*_*ica 50

您需要以下内容:

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
Run Code Online (Sandbox Code Playgroud)

在您的情况下,"名称","类型"和"ID"列匹配值,因此我们可以groupby在这些上调用count然后调用reset_index.

另一种方法是使用"计数"列添加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
Run Code Online (Sandbox Code Playgroud)

  • 这似乎有效,但是如果我们有更多的列(就像我在其他数据框中那样),这不会影响性能吗?此外,它不是很直观。 (3认同)
  • 这里的问题是分组会减少信息量,因此不一定会一次性产生您想要的 df,我更新了我的答案以展示如何分两步完成,这更好理解 (2认同)

jpo*_*bst 42

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

df.groupby(['Name','Type','ID'], as_index=False).count()
Run Code Online (Sandbox Code Playgroud)

  • 这是最简单的答案,适用于其他汇总统计数据。 (3认同)

NeS*_*ack 6

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

  • @NeStack `.agg(col1_sum=('col1', 'sum'), col2_avg=('col2', 'mean'))` (5认同)