讲师中心 微信公众号
AI工具推荐 视频效率加速

如何按分组聚合值排序 Pandas DataFrame

风丽酱_8493

风丽酱_8493

发布时间:2026-07-30 09:07:07

|

1013人浏览过

|

来源于php中文网

原创

如何按分组聚合值排序 Pandas DataFrame

本文介绍如何基于分组统计(如每组最大值)对 dataframe 整体排序,再在组内按另一列(如日期)升序排列,解决“先按州的最高营收排序,再按日期升序”的复合排序需求。

本文介绍如何基于分组统计(如每组最大值)对 dataframe 整体排序,再在组内按另一列(如日期)升序排列,解决“先按州的最高营收排序,再按日期升序”的复合排序需求。

在 Pandas 中,直接使用 sort_values() 无法天然支持“先按分组聚合结果排序,再保留组内顺序”的逻辑——因为 sort_values() 是行级排序,而分组优先级需依赖聚合信息(例如每个 State 的最大 Rev)。用户尝试的 groupby().apply(sort_values()) 方式实际是先全局按 Rev 排序、再分组重排日期,破坏了“以州为单位的整体排序”这一核心要求。

正确思路是:构造一个与原始索引对齐的排序键数组,使同一州的所有行共享相同的主排序权重(如该州 Rev 的最大值),再叠加次级排序键(如 date)。最高效、清晰的方式是使用 numpy.lexsort,它支持多级键排序,且键的传入顺序与优先级相反(即最后传入的键优先级最高)。

✅ 推荐方案:np.lexsort + groupby().transform()

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)
})

# 核心排序:先按「各州 Rev 最大值」降序 → 再按 date 升序
sort_keys = [
    df['date'],  # 次级:date 升序(lexsort 中靠前 = 优先级低)
    -df.groupby('State')['Rev'].transform('max')  # 主级:max Rev 降序(取负后升序等价于原值降序)
]
df_sorted = df.iloc[np.lexsort(sort_keys)].reset_index(drop=True)

print(df_sorted)

输出将严格符合预期:

         date State    Rev     Score  Value
0  2024-05-01    ny  51200  0.978738     11
1  2024-06-01    ny  48732  2.240893     48
2  2024-05-01    nc  24012  0.950088     34
3  2024-06-01    nc  25005 -0.151357     27
4  2024-05-01    fl  21000  1.764052     34
5  2024-06-01    fl  18200  0.400157     22
6  2024-05-01    mi   5676  1.867558     49
7  2024-06-01    mi   6798 -0.977278     33

? 原理说明

  • df.groupby('State')['Rev'].transform('max') 为每行生成其所属州的 Rev 最大值(广播到全组),结果形如 [51200, 51200, 51200, 51200, 24012, 24012, 21000, 21000](对应 ny, nc, fl, mi)。
  • 取负 -... 后,lexsort 对该列升序排序即等效于按原始最大值降序排序。
  • df['date'] 作为第二键,在最大值相同时(如某两州 max(Rev) 相同),按字符串字典序升序排列('2024-05-01' < '2024-06-01' 成立)。

⚠️ 注意事项与增强技巧

  • 稳定性保障:若存在 max(Rev) 完全相同的州(如 ny 和 ca 均为 51200),建议插入中间键确保确定性顺序,例如:
    sort_keys = [
        df['date'],
        df['State'],  # 按州名字母序破平局
        -df.groupby('State')['Rev'].transform('max')
    ]
  • 避免 apply 性能陷阱:groupby().apply(lambda x: x.sort_values(...)) 在大数据集上效率低,且易混淆全局/局部排序逻辑;lexsort 是向量化操作,性能更优。
  • 日期类型提示:若 date 列为字符串(如本例),排序依赖字典序;若为 datetime 类型,效果一致且更健壮,推荐统一转为 pd.to_datetime(df['date'])。

此方法兼具可读性、性能与扩展性,是处理“分组聚合驱动全局排序”类问题的标准实践。

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

Laper
Laper Hot

Laper是专为编剧、导演和制片人推出的 AI 原生剧本创作工具。

VibeKnow
VibeKnow Hot

一款AI视频创作工具,主要用于全球首个AI知识视频创作平台,文档、文章、网页,一键生成视频,适合需要提升相关任务效率的用户。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

PixPix
PixPix Hot

PixPix是一款面向电商视觉生产的AI商品图生成工具。

讯飞智作

讯飞智作是一款AI视频创作工具,AI文本配音工具,数字人课程、营销视频制作。

音述AI
音述AI Hot

一款AI音频处理工具,主要用于音述AI是一个以“用声音述说故事”为核心的 AI 音乐创作与声音分享社区,适合需要提升相关任务效率的用户。

Atoms
Atoms Hot

Atoms是一款AI智能体工具,第一支自动构建真实业务的 AI 团队。

相关专题

更多
python打包成可执行文件
python打包成可执行文件

本专题为大家带来python打包成可执行文件相关的文章,大家可以免费的下载体验。

1811

2023.07.20

python能做什么
python能做什么

python能做的有:可用于开发基于控制台的应用程序、多媒体部分开发、用于开发基于Web的应用程序、使用python处理数据、系统编程等等。本专题为大家提供python相关的各种文章、以及下载和课程。

4744

2023.07.25

format在python中的用法
format在python中的用法

Python中的format是一种字符串格式化方法,用于将变量或值插入到字符串中的占位符位置。通过format方法,我们可以动态地构建字符串,使其包含不同值。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

1749

2023.07.31

python教程
python教程

Python已成为一门网红语言,即使是在非编程开发者当中,也掀起了一股学习的热潮。本专题为大家带来python教程的相关文章,大家可以免费体验学习。

28257

2023.08.03

python环境变量的配置
python环境变量的配置

Python是一种流行的编程语言,被广泛用于软件开发、数据分析和科学计算等领域。在安装Python之后,我们需要配置环境变量,以便在任何位置都能够访问Python的可执行文件。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

3407

2023.08.04

python eval
python eval

eval函数是Python中一个非常强大的函数,它可以将字符串作为Python代码进行执行,实现动态编程的效果。然而,由于其潜在的安全风险和性能问题,需要谨慎使用。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

3407

2023.08.04

scratch和python区别
scratch和python区别

scratch和python的区别:1、scratch是一种专为初学者设计的图形化编程语言,python是一种文本编程语言;2、scratch使用的是基于积木的编程语法,python采用更加传统的文本编程语法等等。本专题为大家提供scratch和python相关的文章、下载、课程内容,供大家免费下载体验。

1203

2023.08.11

python合并两个列表
python合并两个列表

Python是一种强大的编程语言,具有许多方便的功能和工具。在Python中,有多种方法可以合并两个列表。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

616

2023.08.10

Gradle插件开发入门教程
Gradle插件开发入门教程

本专题介绍Gradle插件开发的基本流程,涵盖插件类编写、自定义任务注册、扩展参数设计和插件应用方法,帮助你理解插件如何组织构建逻辑,减少多个项目之间的重复配置。

40

2026.10.22

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn