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

如何高效遍历按连续行分组的Pandas DataFrame?

优化连续分组DataFrame的遍历效率问题

原始DataFrame结构

Col1   Col2     Col3
ABC    00012    Hey!
A1C    00012    Hello!
AAA    00012    Hello
ABC    00033    Hey!
A1C    00021    Hi!
AAA    00021    Hey...
B3Y    00002    Hi.
A5I    00002    Hey?
EAA    00002    Hey!

问题背景

上述DataFrame中,Col2的值已连续聚集(相同值的行集中在连续区域,无需额外排序)。我们需要遍历每个Col2对应的子DataFrame,但当前实现效率极低:

df = pd.read_csv(myfile, sep = "\t")
keys = pd.unique(df["Col2"])
for key in keys:
    subdf = df[df["Col2"] == key]
    myfunction(subdf) # 处理子DataFrame

每次迭代都要对整个DataFrame做过滤操作,重复扫描数据导致效率低下。

优化方案

方案1:用groupby并关闭排序

利用Pandas的groupby方法,结合sort=False参数,直接按原数据中的连续分组生成子DataFrame,避免不必要的排序开销,效率远高于逐次过滤:

df = pd.read_csv(myfile, sep="\t")
for key, subdf in df.groupby("Col2", sort=False):
    myfunction(subdf)

sort=False是核心优化点——它告诉groupby不需要对分组键排序,直接按数据中已有的连续块分割,内部只需要扫描一次数据即可完成分组。

方案2:手动计算索引切片(极致性能)

如果处理超大规模数据集,追求最高性能,可以手动计算分组的索引边界,直接对原DataFrame切片,完全避免groupby的额外开销:

df = pd.read_csv(myfile, sep="\t")
# 标记每个分组的起始位置:当当前行Col2和上一行不同时,分组编号+1
group_ids = df["Col2"].ne(df["Col2"].shift()).cumsum()
# 统计每个分组的行数
group_sizes = group_ids.value_counts().sort_index()

start_idx = 0
for size in group_sizes:
    subdf = df.iloc[start_idx:start_idx + size]
    myfunction(subdf)
    start_idx += size

这种方法通过一次扫描标记分组,再通过索引切片直接获取子DataFrame,全程只遍历数据两次,性能最优。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 00:55:12