Pandas按列groupby时保留原有顺序、按Drivetime升序输出分组结果如何实现?
问题原因
pandas groupby 方法默认开启 sort=True 参数,会自动对分组键按字典序升序排列,因此你提前对原DataFrame做的Drivetime排序逻辑会被覆盖,导致结果默认按OD的字母顺序输出。
解决方法
方法1:关闭groupby自动排序(最简便)
你已经提前将原DataFrame按Orig、Drivetime升序排好序,只需要在groupby时添加sort=False参数,分组就会按照数据中OD对第一次出现的顺序排列,不会打乱原有顺序:
import pandas as pd # 创建测试DataFrame df = pd.DataFrame({'Orig': ['A', 'A', 'A', 'B', 'C'] , 'Dest': ['A1', 'A1', 'B1', 'B2','C1'] , 'Qty': [100, 200, 300, 400, 500], 'Drivetime':[4,4,1,3,5]}) # 先按要求排序 df.sort_values(by =['Orig', 'Drivetime'], inplace=True) # 关闭groupby默认排序,按原有顺序分组聚合 total_qty_per_orig = df.groupby(['Orig', 'Dest'], sort=False).agg({'Qty': 'sum'})
输出结果顺序符合要求:A-B1(Qty=300)排在A-A1(Qty=300)之前。
方法2:聚合后重新排序(更稳妥)
如果存在同一个OD对的Drivetime值不一致的情况,可以在聚合时保留Drivetime字段,聚合完成后再按规则排序,避免数据异常导致顺序错误:
total_qty_per_orig = df.groupby(['Orig', 'Dest'], as_index=False).agg( Qty = ('Qty', 'sum'), Drivetime = ('Drivetime', 'min') # 同一个OD对取最小/最大/任意值均可 ).sort_values(by=['Orig', 'Drivetime']).set_index(['Orig', 'Dest'])
内容的提问来源于stack exchange,提问作者Chipmunk_da
相关产品推荐
相关产品推荐

