【问题标题】:How to group a dataframe by multiple columns, sum and sort the totals in descending order?如何按多列对数据框进行分组,按降序对总数进行求和和排序?
【发布时间】:2026-01-08 16:00:01
【问题描述】:

给定以下数据框:

user_id col1 col2
1       A    4
1       A    22
1       A    112
1       B    -0.22222
1       B    9
1       C    0
2       A    -1
2       A    -5
2       K    NA

我想按 user_id 和 col1 分组并计数。然后按降序对组内的计数进行排序。

这是我正在尝试做的,但我没有得到正确的输出:

df[["user_id", "col1"]]. \
groupby(["user_id", "col1"]). \
agg(counts=("col1","count")). \
reset_index(). \
sort_values(["user_id", "col1", "counts"], ascending=False)

请告知我应该更改哪些内容才能使其正常工作。

预期输出:

user_id col1  counts
1       A     3
        B     2
        C     1
2       A     2
        K     1

【问题讨论】:

  • 请发布您的预期输出。
  • @MayankPorwal 完成并编辑以使其更清晰

标签: python-3.x pandas dataframe group-by


【解决方案1】:

使用GroupBy.size:

In [199]: df.groupby(['user_id', 'col1']).size()
Out[199]: 
user_id  col1
1        A       3
         B       2
         C       1
2        A       2
         K       1

或:

In [201]: df.groupby(['user_id', 'col1']).size().reset_index(name='counts')
Out[201]: 
   user_id col1  counts
0        1    A       3
1        1    B       2
2        1    C       1
3        2    A       2
4        2    K       1

编辑:

In [206]: df.groupby(['user_id', 'col1']).agg({'col2': 'size'})
Out[206]: 
              col2
user_id col1      
1       A        3
        B        2
        C        1
2       A        2
        K        1

EDIT-2:对于排序,使用:

In [213]: df.groupby(['user_id', 'col1'])['col2'].size().sort_values(ascending=False)
Out[213]: 
user_id  col1
1        A       3
2        A       2
1        B       2
2        K       1
1        C       1
Name: col2, dtype: int64

【讨论】:

  • 但是如果是多列呢?我该怎么办?一般的方法是什么。我知道大小。
  • @SteveS 请检查我答案中更新后的EDIT 部分。
  • 非常感谢,只是为了澄清reset_index(name='counts') 的作用?
  • 当你分组时,它会将分组的列放入索引中。所以reset_index 为列创建索引,name='counts' 为列提供名称。
  • 可以,但是我没有看到排序部分,如何保证升序/降序排序?
【解决方案2】:

使用 Mayank 回答的主要思想:

df.groupby(["id_user","col1"]).size().reset_index(name="counts").sort_values(["id_user", "col1"], ascending=False)

解决了我的问题。

【讨论】:

    最近更新 更多