【问题标题】:Sort pandas grouped items with the highest count overall对总体计数最高的 pandas 分组项目进行排序
【发布时间】:2023-01-26 23:09:14
【问题描述】:

假设我有以下数据框:

d = {'col1': ["8","8","8","8","8","2","2","2","2","3","3"], 'col2': ['a', 'b','b','b','b','a','b','a','a','a','b'],
     'col3': ['m', 'n','z','b','a','ac','b1','ad','a1','a','b1'],'col4': ['m', 'n','z','b1','a','ac1','b31','a1d','3a1','a3','b1']}
test = pd.DataFrame(data=d)

为了使用 count 对每个分组项目进行排序,我可以执行以下操作:

test.groupby(["col1",'col2'])['col4'].count().reset_index(name="count").sort_values(["col1","count"],ascending=[True,False]).

它返回此表:

但是,我希望 col1 中带有 8 的组成为第一项,因为该特定组的计数最高(即 4)。

我如何实现这一目标?

编辑:这是预期的输出:

col1    col2    count
8       b        4
8       a        1
2       a        3
2       b        1
3       a        1
3       b        1

【问题讨论】:

  • 你能提供明确的预期输出吗?
  • 这是预期的,因为您首先按 col1 排序,然后按 count 排序,即 sort_values(["col1","count"],ascending=[True,False])。如果你想考虑排序,那么试试sort_values(by=["count"], ascending=False)。但是,这将拆分组成员。您没有提供足够的信息来说明您希望如何对其进行排序。
  • @harryhaller 将按不保留分组项目的计数对所有项目进行排序!
  • @mozway 我添加了预期的输出
  • OK,那就看我下面的回答(虽然我还不清楚你是想用组的最大数还是总数来对组进行排序)

标签: python pandas dataframe group-by


【解决方案1】:

在这种情况下,您需要修复排序。 您的描述有点不清楚,因此是解决问题的一般指南。

Sort_values 从左到右排序,其中第一项定义组的顺序,如果第一项相等,则后续项定义顺序。

因此,请选择要排序的列的顺序并正确设置升序参数。

【讨论】:

  • 对于每个组,我想按计数降序排序。我还想用计数降序对组本身进行排序。
【解决方案2】:

预期的输出不清楚,但假设您想通过减少计数顺序对每个组中的行进行排序,并且按最大(或总)计数的降序相互分组.

(test.groupby(["col1",'col2'])['col4'].count()
     .reset_index(name="count")
     # using the max count per group, for the total use transform('sum')
     .assign(maxcount=lambda d: d.groupby('col1')['count'].transform('max'))
     .sort_values(['maxcount', 'count'], ascending=False)
     .drop(columns='maxcount')
)

输出:

  col1 col2  count
5    8    b      4
4    8    a      1
0    2    a      3
1    2    b      1
2    3    a      1
3    3    b      1

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-22
    • 1970-01-01
    • 1970-01-01
    • 2021-05-07
    • 2020-04-07
    • 2018-01-17
    • 1970-01-01
    相关资源
    最近更新 更多