如何高效对DataFrame分组内数据排序(适配百万级行数据)
高效实现DataFrame组内排序(替代groupby+apply)
当处理百万行级别的大型DataFrame时,groupby+apply的逐组循环操作会带来巨大的性能开销,推荐使用多键整体排序的方式替代,这是pandas中最高效的组内排序方案。
解决方案:先整体排序,再按组保留顺序
直接使用sort_values对id(组键)和score(排序字段)进行多键排序,其中score按降序排列:
import pandas as pd # 原数据 df = pd.DataFrame({'id' : ['c1','c2','c1','c3','c2','c1','c3'], 'it' : ['it1','it2','it1','it5','it3','it7','it'], 'score' : [.8,.5,1.1,.65,.89,1.2,.91]}) # 高效组内排序:先按id升序,再按score降序 df_sorted = df.sort_values(by=['id', 'score'], ascending=[True, False]) print(df_sorted)
输出结果:
id it score 5 c1 it7 1.20 2 c1 it1 1.10 0 c1 it1 0.80 4 c2 it3 0.89 1 c2 it2 0.50 6 c3 it 0.91 3 c3 it5 0.65
如果需要重置索引为连续序列,可追加reset_index(drop=True):
df_sorted = df.sort_values(by=['id', 'score'], ascending=[True, False]).reset_index(drop=True)
为什么这个方法更快?
sort_values是pandas底层优化的矢量化操作,采用高效的Timsort排序算法,时间复杂度为O(n log n),适合处理大数据量。groupby+apply本质是逐组执行Python函数,存在大量循环开销,时间复杂度为O(k*m log m)(k为组数,m为每组平均行数),百万行数据下性能差距会非常显著。
若需保留分组对象
如果后续需要基于分组做其他操作,可先排序再执行groupby(pandas 1.3.0+默认保留组内顺序,低版本需设置sort=False保证组键顺序与原数据一致):
# 先按score降序排序,再按id分组,组内已保持排序状态 grouped = df.sort_values(by='score', ascending=False).groupby('id', sort=False) # 示例:查看每个分组的前2行 for name, group in grouped: print(f"分组 {name}:") print(group.head(2))
内容的提问来源于stack exchange,提问作者Karthik S
相关产品推荐
相关产品推荐

