Python:按指定列排序并自动升序排列其余列
Pandas多列排序:指定列优先,其余列自动升序
问题场景
现有如下Pandas DataFrame,需要先按person和buydate列排序,同时让所有其他列自动按升序排列:
import pandas as pd df = pd.DataFrame({'person': [1, 1, 1, 2, 3, 3], 'brand': ['b', 'a', 'a', 'b', 'a', 'b'], 'product': ['A1', 'A1', 'A2', 'B1', 'C1', 'C2'], 'buydate': ['20220101', '20220101', '20220401', '20220601', '20220630', '20221201'], 'type': ['2', '1', '1', '1', '1', '2'], 'price': [50, 20, 200, 300, 20, 150],})
期望排序结果:
| person | brand | product | buydate | type | price | |
|---|---|---|---|---|---|---|
| 0 | 1 | a | A1 | 20220101 | 1 | 20 |
| 1 | 1 | b | A1 | 20220101 | 2 | 50 |
| 2 | 1 | a | A2 | 20220401 | 1 | 200 |
| 3 | 2 | b | B1 | 20220601 | 1 | 300 |
| 4 | 3 | a | C1 | 20220630 | 1 | 20 |
| 5 | 3 | b | C2 | 20221201 | 2 | 150 |
尝试仅按person和buydate排序的代码无法得到预期结果(person=1的前两行顺序错误):
df = df.sort_values(['person', 'buydate'])
要求解决方案运行高效,适配大数据集,可接受lambda方法。
高效解决方案
直接将person、buydate作为首要排序键,再加入所有剩余列组成完整排序列表,利用Pandas矢量化排序的高效性完成需求:
# 构建排序列列表:先指定person、buydate,再加入其余所有列 sort_columns = ['person', 'buydate'] + [col for col in df.columns if col not in ['person', 'buydate']] # 执行排序(ascending=True为默认,可省略) df_sorted = df.sort_values(sort_columns)
原理说明
- 当
person和buydate的值相同时,会自动按后续列(brand、product、type、price)依次升序排列,正好匹配你需要的结果。 - 这种方法基于Pandas原生的
sort_values矢量化操作,比lambda自定义排序效率高得多,适合处理大规模数据集。
验证结果
运行上述代码后,person=1且buydate为20220101的两行会按brand(a < b)、type(1 < 2)、price(20 < 50)的顺序排列,完全符合预期。
内容的提问来源于stack exchange,提问作者cookiecookie
相关产品推荐
相关产品推荐

