当前位置: 首页 > 图灵资讯 > 行业资讯> 如何使用 groupby 实现多级排序:按组内最大值排序分组,再按时间升序排列

如何使用 groupby 实现多级排序:按组内最大值排序分组,再按时间升序排列

来源:图灵python
时间: 2026-07-30 17:12:30

本文介绍了如何在这里 Pandas 实现“先按分组聚合指标(如每组最大指标) Rev)降序排列组的顺序,然后在组内按顺序排列 date 复合排序需求的升序排序,核心方案是结合 np.lexsort 与 groupby().transform()。

本文介绍了如何在这里 pandas 实现“先按分组聚合指标(如每组最大指标) rev)降序排列组的顺序,然后在组内按顺序排列 date 复合排序需求的升序排序,核心方案是结合 `np.lexsort` 与 `groupby().transform()`。

在实际数据分析中,往往需要对 DataFrame 跨组优先级排序——也就是说,根据每个分组的聚合特征,而不仅仅是一列排序(如各州最高收入) Rev)确定组间顺序,然后根据时间等维度对组内进行精细排序。Pandas 的 sort_values() 不能直接支持“按” groupby 对聚合结果进行排序 groupby().apply() 容易导致索引混乱或逻辑错位(如问题中的错误示例所示)。

✅ 正确的解决方案:使用 numpy.lexsort np稳定排序实现多级稳定排序.lexsort 按照从后到前的优先级顺序接收一个键数组列表(即列表末尾为最高优先级)。我们需要构建两个关键的排序键:

  • 最高优先级(主排序):各州 Rev 最大值,并且需要降序 → 用 -df.groupby('State')['Rev'].transform('max')
  • 次优先级(组内排序):date 列,升序 → 直接传入 df['date']
import pandas as pd
import numpy as np

# 结构示例数据(与原始问题相同)
np.random.seed(0)
df = pd.DataFrame({
    'date': np.tile(['2024-05-01', '2024-06-01'], 4),
    'State': np.repeat(['fl', 'ny', 'mi', 'nc'], 2),
    'Rev': [21000, 18200, 51200, 48732, 5676, 6798, 24012, 25005],
    'Score': np.random.normal(size=8),
    'Value': np.random.randint(10, 50, size=8)
})

# ✅ 核心排序逻辑
out = df.iloc[np.lexsort([
    df['date'],                                    # 次优先级:date 升序(最后传入,优先级最高)
    -df.groupby('State')['Rev'].transform('max')   # 优先级:各州最大 Rev 降序
])]

print(out)

? 严格符合要求的输出结果:

jquery可以拖动网格布局排列代码

基于gridsterrry的jQuery可以拖动网格布局排列代码.js网格布局插件。

下载

  • 组间顺序由 State 对应的最大 Rev 决定(NY: 51200 → NC: 25005 → FL: 21000 → MI: 6798)
  • 每组内 date 按字符串排列(2024-05-01) 在前,2024-06-01 在后)

⚠️ 注意事项:

  • transform('max') 确保每一行都能获得其所属 State 的最大 Rev,避免 agg 导致维度不匹配;
  • 使用 - 实现降序,因为 lexsort 默认升序;
  • 若存在 Rev.max() 相同的州(如 NY 和 CA 均为 51200)建议添加第三级排序键(如 df['State保证结果的唯一性:
    out = df.iloc[np.lexsort([
        df['date'],
        df['State'],  # 中等优先级:州名升序破平局
        -df.groupby('State')['Rev'].transform('max')
    ])]

? 扩展提示:该模型适用于任何聚合指标(如 mean, sum, first),也可以嵌套多层逻辑(如“按组内最新日期排序,然后按总收入降序”),灵活性远超链式 sort_values + groupby.apply。