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

Pandas:替代iterrows的高效通用行遍历方法问询

高效遍历Pandas DataFrame行并转换为列表的优化方案

问题背景

需要处理列数不固定的多个CSV文件,遍历每行并将各列值整理为列表,原代码使用iterrows()效率较低,寻求通用的高效实现。

原代码:

files = os.listdir(rute)

for file in list(files):
    filename = rute + '\\' + file
    print(filename)
    df = pd.read_csv(filename, index_col=None, header=0)
    df = df.fillna('') 
    columns = list(df.columns)
    
    for idx, row in df.iterrows():
        fila = []
        for key in columns:
            fila.append(row[key])
        print(fila)

优化方案

1. 使用itertuples()(推荐,兼顾效率与可读性)

itertuples()返回命名元组,比iterrows()快得多,且自动适配任意列数,无需手动遍历列名:

import os
import pandas as pd

rute = "你的目标路径"
files = os.listdir(rute)

for file in files:
    # 用os.path.join替代硬编码路径分隔符,提升跨平台兼容性
    filename = os.path.join(rute, file)
    print(filename)
    # 链式调用简化代码
    df = pd.read_csv(filename, index_col=None, header=0).fillna('')
    
    # index=False 忽略DataFrame的索引,只返回行数据元组
    for row in df.itertuples(index=False):
        fila = list(row)
        print(fila)

2. 使用to_numpy()(最高效,适合大数据量)

直接将DataFrame转换为numpy二维数组,遍历数组行的开销远低于操作Pandas对象:

import os
import pandas as pd

rute = "你的目标路径"
files = os.listdir(rute)

for file in files:
    filename = os.path.join(rute, file)
    print(filename)
    df = pd.read_csv(filename, index_col=None, header=0).fillna('')
    # 转换为numpy数组,每行对应原DataFrame的一行
    data_array = df.to_numpy()
    
    for fila in data_array:
        fila_list = list(fila)
        print(fila_list)

原代码效率低的原因

原代码使用iterrows()遍历,每次返回的是Series对象,再嵌套循环遍历列名取值,双重循环带来大量不必要的Pandas对象开销,数据量越大效率差距越明显。

内容的提问来源于stack exchange,提问作者Keras-JOB

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 18:33:31