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
相关产品推荐
相关产品推荐

