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

如何高效缩减Pandas DataFrame中分组后的组大小?

高效实现Pandas分组后缩减行数的方案

嘿,我完全懂你现在的困扰——用for循环挨个处理分组,数据量大的时候简直慢到让人抓狂对吧?别担心,Pandas早就给我们准备了更高效的解决方案,既能实现你的需求,又能大幅提升运行效率!

先说说原代码的性能瓶颈

你当前的循环实现里,每次都用pd.concat去拼接新的分组数据,这会导致反复创建新的DataFrame并复制已有数据,当分组数量多、单组数据量大时,时间复杂度会飙升到O(n²),自然效率极低。

高效替代方案

方案1:和原逻辑完全一致的按步长选取(用groupby.apply)

如果你需要严格按照“组内行数超过指定值时,按步间隔选取行”的逻辑,用groupby.apply结合自定义函数就能搞定,而且避免了循环拼接的开销:

target_number_rows = 10

def trim_group(group):
    # 只有当组内行数超过目标值时才进行缩减
    if len(group) > target_number_rows:
        # 计算步长,和你原代码逻辑一致
        step_size = len(group) // target_number_rows
        return group.iloc[::step_size]
    # 行数不足时直接返回原组
    return group

# 分组处理后重置索引
df_final = df.groupby('NAME').apply(trim_group).reset_index(drop=True)

这个方法的优势:

  • 一次性处理所有分组,底层优化过的apply比手动循环高效得多
  • 代码更简洁,可读性更强,维护成本低

方案2:随机选取固定行数(性能最优,推荐)

如果你的需求只是每个组保留指定行数的任意行(不需要严格按步长),那groupby.sample是性能最好的选择——这是Pandas底层实现的优化方法,比apply还要快:

target_number_rows = 10

df_final = df.groupby('NAME').sample(
    n=target_number_rows,
    replace=False,  # 不重复选取行,组内行数不足时自动保留所有行
    random_state=42  # 固定随机种子,保证结果可复现
)

性能对比

  • 原循环实现:数据量较大时,运行时间会随着分组数量和数据量呈平方增长
  • groupby.apply:运行时间线性增长,比循环快2-5倍(取决于数据规模)
  • groupby.sample:性能最优,是专门为这类需求设计的方法,比apply还要快1-2倍

内容的提问来源于stack exchange,提问作者James Hall

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 00:58:10