多列分组排序技巧详解
作者:BrightSoul
时间:2026-03-02
浏览:0
本文介绍如何在不丢失原始行数据的前提下,按指定列(如Deal、Commodity、startdate)对PandasDataFrame进行逻辑分组式排序,使同类记录连续排列,便于后续分析或展示。

本文介绍如何在不丢失原始行数据的前提下,按指定列(如 Deal、Commodity、startdate)对 Pandas DataFrame 进行逻辑分组式排序,使同类记录连续排列,便于后续分析或展示。
在数据分析中,“分组”常被理解为使用 groupby() 进行聚合(如求和、均值),但有时我们真正需要的并非聚合结果,而是保持所有原始行不变,仅将具有相同关键字段的记录在物理顺序上聚拢在一起——这本质上是排序(sorting)问题,而非分组(grouping)问题。
从你的需求来看:你希望将 Deal、Commodity 和 startdate 相同的记录“归堆”排列(例如所有 Sell + (stock1, stock2) + 01Jan23 连续出现),同时保留每行的完整信息(如 ID、quantity、mtmvalue 等)。此时,正确做法是调用 sort_values(),而非 groupby():
# 按 Deal(降序)、Commodity(升序)、startdate(升序)排序
df_sorted = df.sort_values(
by=['Deal', 'Commodity', 'startdate'],
ascending=[False, True, True] # Sell 在 Buy 前,符合示例输出
).reset_index(drop=True)运行后即可得到目标结构:Sell 类型记录集中排在前,Buy 类型紧随其后;同一 Deal 下,Commodity 和 startdate 相同的行自然相邻。
⚠️ 注意事项:
- sort_values() 不会改变原始数据内容,仅调整行顺序,因此完全满足“保留原始行+实现视觉分组”的需求;
- 若需进一步控制同组内的次序(例如 Buy 组内按 quantity 从大到小排),可扩展 by 参数:
by=['Deal', 'Commodity', 'startdate', 'quantity'],并设置对应 ascending; - 列名需严格匹配(如原文中 'StartDate' 应为 'startdate',注意大小写与下划线);
- 对含日期字符串的列(如 '01Jan23'),若后续需时间运算,建议先转为 datetime 类型:
df['startdate'] = pd.to_datetime(df['startdate'], format='%d%b%y'),再参与排序更健壮。
总结:当目标是“让相似行挨在一起”而非“合并计算”,请优先考虑 sort_values() —— 它轻量、高效、可逆,且天然保留全部原始字段,是实现逻辑分组显示最直接可靠的方案。
作者最新文章
索尼 Xperia 1 VIII / VII / VI 等手机获 Android 17 更新,新增桌面模式等功能
2026-09-08 16:44
加拿大留学监护声明书(IMM 5646)双页签署与公证核对指南
2026-09-03 15:02
在线PDF转图片教程:一键生成高清图片包
2026-09-03 12:04
Creo零基础入门:新建零件与第一次拉伸建模完整指南
2026-09-03 06:02
扫描件PDF转Word的在线操作步骤与编辑可行性判断
2026-09-02 18:39
热门文章
更多
精品专题
更多
Mac软件
更多
WINDOWS
更多


































