You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何以简洁方式按类别组及最小值对Pandas DataFrame排序(类似窗口分区)

实现类窗口分区的Pandas分组排序需求

你要的效果是先把每个分组内的元素按值升序排好,再把所有分组的第1个元素按组名(或组最小值)集中排列,第2个元素同理,最终形成类似窗口分区的横向排布。下面是两种贴合需求的实现方式:


方式一:按组名顺序排列同位置元素

这完全匹配你给出的目标结果:

import pandas as pd

# 初始数据
data_initial = {
    'Section': ['A', 'C', 'C', 'B', 'A', 'D', 'B', 'D'],
    'Content': [3, 5, 2, 3, 1, 1, 0, 2]
}
df_initial = pd.DataFrame(data_initial)

# 1. 先按分组+组内值升序排序,确保每个组内元素从小到大
df_group_sorted = df_initial.sort_values(['Section', 'Content'])

# 2. 给每个组内的元素标记位置(第1个、第2个...)
df_group_sorted['group_pos'] = df_group_sorted.groupby('Section').cumcount()

# 3. 先按组内位置排序,同位置的元素再按组名排序,最后删掉辅助列
df_final = df_group_sorted.sort_values(['group_pos', 'Section']).drop('group_pos', axis=1)

print(df_final)

输出结果和你提供的df_sorted完全一致:

Section  Content
4       A        1
6       B        0
2       C        2
5       D        1
0       A        3
3       B        3
1       C        5
7       D        2

方式二:按组最小值排序同位置元素

如果需要优先按每个分组的最小值来决定分组顺序(而不是组名字母顺序),可以用这个版本:

# 基于上面的df_group_sorted,先计算每个分组的最小值
min_content_per_group = df_group_sorted.groupby('Section')['Content'].min().rename('min_content')
df_with_min = df_group_sorted.merge(min_content_per_group, on='Section')

# 排序逻辑:先组内位置,再分组最小值,最后组名(处理最小值相同的情况)
df_final_by_min = df_with_min.sort_values(['group_pos', 'min_content', 'Section']).drop(columns=['group_pos', 'min_content'])

print(df_final_by_min)

输出结果会把最小值更小的分组排在前面:

Section  Content
6       B        0
4       A        1
5       D        1
2       C        2
3       B        3
0       A        3
7       D        2
1       C        5

内容的提问来源于stack exchange,提问作者robin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 03:09:56