You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何高效对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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 14:20:40