如何使用pandas对DataFrame按group和interval同时升序排序?
解决方案
你可以通过在sort_values方法中同时指定多个排序字段,并为每个字段设置对应的排序规则,直接实现先按group升序、再按interval升序的组合排序,无需分步执行。
实现代码
import pandas as pd data = { 'group': ['2', '1', '2', '2', '2', '1'], 'interval': ['20-30', '20-30', '30-40', '10-20', '10-20', '0-10'], 'count': [3, 4, 2, 7, 5, 1], } df = pd.DataFrame(data) # 组合排序:先按group升序,再按interval升序 result_df = df.sort_values( by=['group', 'interval'], key=lambda s: s.astype(int) if s.name == 'group' else s.str.split('-').str[0].astype(int), ascending=True ).reset_index(drop=True) print(result_df)
输出结果
group interval count 0 1 0-10 1 1 1 20-30 4 2 2 10-20 7 3 2 10-20 5 4 2 20-30 3 5 2 30-40 2
关键说明
by=['group', 'interval']:明确排序优先级,先按group排序,同一group内再按interval排序key参数:针对不同字段设置排序逻辑:group字段:将字符串转为整数,避免字符串字典序排序的问题(比如'10'会排在'2'前面)interval字段:按-分割字符串,取区间起始值转为整数排序,保证区间按数值顺序排列(而非字符串字典序)
ascending=True:所有字段均采用升序排序,这是默认值,可省略
关于分步排序的问题
你之前的分步排序代码会先按group排序,然后再按interval重新全局排序,这会覆盖掉之前的group分组排序结果,最终只能得到interval单独排序的结果,无法实现你需要的组合排序效果。而同时指定多个字段排序时,Pandas会在第一个字段的分组内进行二次排序,完全符合你的需求。
内容的提问来源于stack exchange,提问作者shsh
相关产品推荐
相关产品推荐

