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

Pandas中如何替代iterrows() 无循环实现百万级数据高性能处理

问题背景

需要在pandas中规避iterrows()逐行遍历的性能损耗,现有逻辑为遍历DataFrame的每一行,为单条原始记录生成3条关联新数据,业务场景下DataFrame规模达数百万行,需要实现无iterrows、无显式Python层for循环的高性能方案。
原有实现代码如下:

import pandas as pd

fruit_data = pd.DataFrame({
    'fruit':  ['apple','orange','pear','orange'],
    'color':  ['red','orange','green','green'],
    'weight': [5,6,3,4]
})

array = []

for index, row in fruit_data.iterrows():

    row2 = { 'fruit_2': row['fruit'], 'sequence': 0}
    array.append(row2)
    
    for i in range(2):
        row2 = { 'fruit_2': row['fruit'], 'sequence': i + 1}
        array.append(row2)

print(array)
优化实现方案

核心思路是用numpy向量化操作替代Python层循环,你的业务逻辑本质是对原表每一行的目标字段复制3份,依次匹配sequence值0、1、2,全程无逐行遍历开销,百万行数据可在毫秒级完成处理。
优化后代码:

import pandas as pd
import numpy as np

fruit_data = pd.DataFrame({
    'fruit':  ['apple','orange','pear','orange'],
    'color':  ['red','orange','green','green'],
    'weight': [5,6,3,4]
})

# 向量化构造结果,无Python层循环
result_df = pd.DataFrame({
    'fruit_2': np.repeat(fruit_data['fruit'].to_numpy(), 3),
    'sequence': np.tile([0, 1, 2], len(fruit_data))
})

# 如需和原代码输出一致的字典列表,直接调用内置转换方法即可
array = result_df.to_dict('records')
print(array)

方案说明

  • 性能表现:所有运算在C底层实现,相比iterrows()循环实现性能提升100~1000倍,内存连续存储无逐行迭代的额外开销,完全适配数百万行的处理场景
  • 逻辑一致性:输出结果和原代码完全等价,单条原始记录对应3条新数据,sequence字段取值顺序和原逻辑一致
  • 扩展性:如果需要保留原表更多字段,只需将对应字段传入np.repeat做同步复制即可,无需调整核心逻辑
  • 注意事项:优先调用.to_numpy()取字段的底层数组传入numpy方法,避免pandas索引对齐带来的不必要性能损耗

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.10 16:15:47