如何优化pandas中DataFrame的迭代操作,提升自定义ID生成效率?
问题说明
你需要遍历DataFrame的每一行,基于现有name、sex两列为每行生成ID,最终将该新列添加到df中,当前使用的逐行遍历方案性能较低,需要更高效的实现方式。你当前的实现代码如下:
import pandas as pd df = pd.read_csv(file, sep='\t', dtype=str, na_values="", low_memory=False) row_ids = [] for index, row in df.iterrows(): if (index % 1000) == 0: print("Row node index: {}".format(str(index))) # 注意原代码此处存在语法错误,参数传递应改为get_id(row['name'], row['sex']) calculated_id = get_id(row['name'], row['sex']) row_ids.append(calculated_id) df['id'] = row_ids
iterrows遍历需要将每行数据转换为Series对象,额外开销极大,在数据量较大时性能非常差,可通过以下方案优化:
优化方案
- 最优方案:向量化调用(性能提升100倍以上)
如果你的get_id函数支持直接传入整列的Series对象批量计算,直接传递两列作为参数即可,完全避免Python层的循环开销,是性能最高的实现:
df['id'] = get_id(df['name'], df['sex'])
如果需要保留每处理1000行打印进度的需求,可以在get_id内部新增进度打印逻辑,或者拆分数据分批处理即可。
- 次优方案:
apply批量处理(性能提升5~10倍)
如果get_id只能接收单组name和sex的字符串输入,无法修改为向量化逻辑,使用apply替代iterrows也能大幅提升性能,apply省去了iterrows逐行封装为Series的额外开销:
# 不需要打印进度的写法 df['id'] = df.apply(lambda row: get_id(row['name'], row['sex']), axis=1) # 需要保留每1000行打印进度的写法 def process_row(row): if row.name % 1000 == 0: print(f"Row node index: {row.name}") return get_id(row['name'], row['sex']) df['id'] = df.apply(process_row, axis=1)
内容的提问来源于stack exchange,提问作者marlon
相关产品推荐
相关产品推荐

