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

Pandas中一种特殊的双列分组排序需求

解决方法:分组后按组内最小时间排序 + 组内排序

我来帮你搞定这个需求!你想要的是先按每个col_1分组,组内按remaining time从小到大排序,同时整个分组的顺序也是按各组的最短remaining time来排列(比如A组最早的时间是01:00,所以排在最前面,然后是C组的01:30,最后是B组的01:45)。下面是具体的实现步骤和代码:

步骤说明

  1. 首先将字符串格式的remaining time转换为可排序的时间类型(避免字符串排序的潜在问题);
  2. 计算每个col_1分组的最短remaining time,以此作为分组的排序依据;
  3. 先按分组的最短时间排序,再在每个分组内按remaining time从小到大排序;
  4. 最后将时间列转回原来的HH:MM格式。

完整代码

import pandas as pd

# 1. 创建原始DataFrame
data = {
    'col_1': ['B', 'A', 'C', 'A', 'B', 'C', 'C', 'B', 'A'],
    'serial_number': ['17', '02', '25', '03', '12', '07', '89', '45', '01'],
    'remaining time': ['02:45', '02:00', '03:30', '03:00', '03:45', '01:30', '02:30', '01:45', '01:00']
}
df = pd.DataFrame(data)

# 2. 将remaining time转换为timedelta类型,确保排序逻辑正确
df['remaining time'] = pd.to_timedelta(df['remaining time'])

# 3. 计算每个col_1分组的最小剩余时间,用于确定分组的整体顺序
group_min_time = df.groupby('col_1')['remaining time'].min().reset_index(name='group_min')

# 4. 合并分组最小时间到原DataFrame,方便后续排序
df = df.merge(group_min_time, on='col_1')

# 5. 先按分组最小时间排序(确定组的顺序),再按组内剩余时间排序
df_sorted = df.sort_values(by=['group_min', 'remaining time']).drop(columns='group_min')

# 6. 将时间列转回HH:MM格式的字符串
df_sorted['remaining time'] = df_sorted['remaining time'].astype(str).str[-8:-3]

# 查看结果
print(df_sorted)

运行结果

col_1 serial_number remaining time
8     A            01          01:00
1     A            02          02:00
3     A            03          03:00
5     C            07          01:30
6     C            89          02:30
2     C            25          03:30
7     B            45          01:45
0     B            17          02:45
4     B            12          03:45

这个结果完全符合你的预期:每个col_1的组集中展示,组内按剩余时间从小到大排序,同时整个分组的顺序也是按各组的最短剩余时间排列的。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 07:40:27