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

如何对Pandas DataFrame按分组排序:组间按指定Rev降序,组内按日期升序

Pandas DataFrame按指定组优先级排序问题

示例DataFrame

生成示例数据的代码:

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

生成的DataFrame内容:

dateStateRevScoreValue
02024-05-01fl210001.76405234
12024-06-01fl182000.40015722
22024-05-01ny512000.97873811
32024-06-01ny487322.24089348
42024-05-01mi56761.86755849
52024-06-01mi6798-0.97727833
62024-05-01nc240120.95008834
72024-06-01nc25005-0.15135727

需求说明

排序规则如下:

  • 每个State分组的整体排序优先级,由该组中date为2024-05-01的Rev值从大到小决定,最终组的顺序应为NY、NC、FL、MI
  • 每个State分组内部,按date列升序排列

尝试的代码及问题

尝试了以下代码,但未得到预期结果:

(df.sort_values(by = ['Rev'], ascending = [False]).
     groupby('State', as_index = False).
     apply(lambda x : x.sort_values('date')).reset_index(drop = True))

错误输出中组的顺序不符合要求:

dateStateRevScoreValue
02024-05-01fl210001.76405234596766434
12024-06-01fl182000.400157208367223322
22024-05-01mi56761.867557990149967549
32024-06-01mi6798-0.97727787987641133
42024-05-01nc240120.950088417525589434
52024-06-01nc25005-0.151357208297697927
62024-05-01ny512000.978737984105739211
72024-06-01ny487322.24089319920145848

正确实现代码

方法:利用分类变量定义组顺序

先提取每个State的5月1日Rev值,按其降序确定组的顺序,再将State列转为分类变量,最后按组和日期排序:

# 获取按5月1日Rev降序排列的State顺序
state_order = df[df['date'] == '2024-05-01'].sort_values('Rev', ascending=False)['State'].tolist()
# 将State转为分类变量,指定顺序
df['State'] = pd.Categorical(df['State'], categories=state_order, ordered=True)
# 按State(已定义顺序)和date升序排序
result = df.sort_values(['State', 'date']).reset_index(drop=True)

预期输出

执行上述代码后,输出结果如下:

dateStateRevScoreValue
02024-05-01ny512000.97873811
12024-06-01ny487322.24089348
22024-05-01nc240120.95008834
32024-06-01nc25005-0.15135727
42024-05-01fl210001.76405234
52024-06-01fl182000.40015722
62024-05-01mi56761.86755849
72024-06-01mi6798-0.97727833

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 06:00:19