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

如何优化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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 00:54:03