Pandas中一种特殊的双列分组排序需求
解决方法:分组后按组内最小时间排序 + 组内排序
我来帮你搞定这个需求!你想要的是先按每个col_1分组,组内按remaining time从小到大排序,同时整个分组的顺序也是按各组的最短remaining time来排列(比如A组最早的时间是01:00,所以排在最前面,然后是C组的01:30,最后是B组的01:45)。下面是具体的实现步骤和代码:
步骤说明
- 首先将字符串格式的
remaining time转换为可排序的时间类型(避免字符串排序的潜在问题); - 计算每个
col_1分组的最短remaining time,以此作为分组的排序依据; - 先按分组的最短时间排序,再在每个分组内按
remaining time从小到大排序; - 最后将时间列转回原来的
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
相关产品推荐
相关产品推荐

