如何以简洁方式按类别组及最小值对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
相关产品推荐
相关产品推荐

