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

大数据框嵌套for循环效率低下,求改用apply函数优化方案

解决大型DataFrame嵌套循环效率问题

我太懂你这种感受了——25万行的DataFrame用嵌套for循环跑,简直是在等“永恒”。先拆解下你的代码逻辑:只要某一行j的第5列不为空,就遍历整个数据集,把所有和j第1列相同、且第5列为空的行k,用j的第5列值补上。这个需求完全不需要用循环或者apply,用pandas的原生分组填充就能秒级搞定。

高效解决方案

直接用groupby + transform实现矢量化填充,底层是C级别的运算,比Python循环快几个数量级:

# 按第1列分组,用组内第一个非NA值填充所有NA行
df[5] = df.groupby(1)[5].transform(lambda x: x.fillna(x.dropna().iloc[0]))

如果你的需求是用组内最后一个非NA值填充,只需要把iloc[0]改成iloc[-1]:

df[5] = df.groupby(1)[5].transform(lambda x: x.fillna(x.dropna().iloc[-1]))

要是组内的非NA值是按顺序出现的,也可以用更简洁的前后填充:

# 向前填充:用组内前面最近的非NA值补后面的空值
df[5] = df.groupby(1)[5].ffill()

# 向后填充:用组内后面最近的非NA值补前面的空值
df[5] = df.groupby(1)[5].bfill()

为什么你的原代码这么慢?

你的嵌套循环是**O(n²)**的时间复杂度——25万行的话,就是25万×25万=625亿次迭代!Python的循环本身就比编译型语言慢,这么大的次数完全是灾难级的效率。哪怕换成apply,本质上还是逐行/逐组的Python层面运算,效率远不如pandas原生的矢量化操作。

补充说明

  • 如果你的第1列是字符串或类别型数据,建议先转成category类型,能进一步提升groupby的效率;
  • 如果组内存在多个不同的非NA值,你需要明确填充规则(比如取均值、中位数),只需要把x.dropna().iloc[0]换成对应的聚合函数即可,比如x.mean()。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 07:03:56