如何对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内容:
| date | State | Rev | Score | Value | |
|---|---|---|---|---|---|
| 0 | 2024-05-01 | fl | 21000 | 1.764052 | 34 |
| 1 | 2024-06-01 | fl | 18200 | 0.400157 | 22 |
| 2 | 2024-05-01 | ny | 51200 | 0.978738 | 11 |
| 3 | 2024-06-01 | ny | 48732 | 2.240893 | 48 |
| 4 | 2024-05-01 | mi | 5676 | 1.867558 | 49 |
| 5 | 2024-06-01 | mi | 6798 | -0.977278 | 33 |
| 6 | 2024-05-01 | nc | 24012 | 0.950088 | 34 |
| 7 | 2024-06-01 | nc | 25005 | -0.151357 | 27 |
需求说明
排序规则如下:
- 每个
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))
错误输出中组的顺序不符合要求:
| date | State | Rev | Score | Value | |
|---|---|---|---|---|---|
| 0 | 2024-05-01 | fl | 21000 | 1.764052345967664 | 34 |
| 1 | 2024-06-01 | fl | 18200 | 0.4001572083672233 | 22 |
| 2 | 2024-05-01 | mi | 5676 | 1.8675579901499675 | 49 |
| 3 | 2024-06-01 | mi | 6798 | -0.977277879876411 | 33 |
| 4 | 2024-05-01 | nc | 24012 | 0.9500884175255894 | 34 |
| 5 | 2024-06-01 | nc | 25005 | -0.1513572082976979 | 27 |
| 6 | 2024-05-01 | ny | 51200 | 0.9787379841057392 | 11 |
| 7 | 2024-06-01 | ny | 48732 | 2.240893199201458 | 48 |
正确实现代码
方法:利用分类变量定义组顺序
先提取每个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)
预期输出
执行上述代码后,输出结果如下:
| 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 |
内容的提问来源于stack exchange,提问作者Karthik S
相关产品推荐
相关产品推荐

