不依赖Pandas的原生Python数据填充方案 替代df.iterrows()
原生Python替代Pandas iterrows的性能优化方案
iterrows性能差的核心原因是每次迭代都会生成Pandas Series对象,额外开销极高,全量数据场景下性能衰减非常明显。以下是完全不依赖Pandas的原生Python实现方案:
方案1:数据源为CSV文件场景
直接使用Python内置的csv模块读写数据,无需引入Pandas依赖:
import csv from external_package import SearchEngine # 提前实例化搜索对象,避免循环内重复初始化开销 search_engine = SearchEngine() def fillin_func(input_csv_path, output_csv_path): # 读取源数据 with open(input_csv_path, 'r', encoding='utf-8') as input_f: reader = csv.DictReader(input_f) field_list = reader.fieldnames processed_data = [] for row in reader: # 可根据实际空值格式调整判断条件,csv读取的空值默认会是空字符串 if not row['x'] or row['x'] is None: result = search_engine(row['z']) row['x'] = result.fillval processed_data.append(row) # 写入处理结果 with open(output_csv_path, 'w', encoding='utf-8', newline='') as output_f: writer = csv.DictWriter(output_f, fieldnames=field_list) writer.writeheader() writer.writerows(processed_data)
方案2:数据源为内存列表结构场景
如果数据已经加载到内存,格式为列表嵌套字典([{'x': None, 'z': 'test1'}, ...]),直接遍历即可:
from external_package import SearchEngine from functools import lru_cache search_engine = SearchEngine() # 可选优化:如果z列重复值多,添加缓存避免重复调用第三方接口 @lru_cache(maxsize=None) def get_cached_fill_val(z): return search_engine(z).fillval def fillin_func(source_data): for row in source_data: if row['x'] is None: row['x'] = get_cached_fill_val(row['z']) return source_data
性能说明
- 原生Python遍历字典列表的速度比
iterrows快10倍以上 - 新增的lru_cache缓存逻辑在z列重复值占比高的场景下,可进一步将处理速度提升数倍到数十倍
内容的提问来源于stack exchange,提问作者GK89
相关产品推荐
相关产品推荐

