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

如何更优雅地实现将函数应用于DataFrame每行并写入结果?

更优雅高效的Pandas逐行函数应用方案

当然有更简洁高效的实现方式!你当前使用iterrows()循环拼接的方法虽然能完成任务,但存在两个明显的问题:一是iterrows()本身的迭代效率较低,数据量大时会拖慢运行速度;二是每次循环都用pd.concat()拼接结果,会产生大量中间对象,进一步降低性能,同时代码也显得冗余。

下面给你两种更优的方案:

方案一:使用DataFrame.apply()(最直接的替代)

apply()方法可以直接按行(或列)批量应用函数,代码简洁且比iterrows()更高效:

# 直接在原DataFrame上添加结果列
input_panel['target'] = input_panel.apply(lambda row: my_function(*row), axis=1)
  • axis=1指定按行处理数据;
  • *row会把当前行的所有元素按顺序作为位置参数传入my_function;
  • 不需要额外创建空DataFrame和循环拼接,直接将结果赋值给新列target,一步到位。

如果你的函数参数和DataFrame列的顺序不完全匹配,建议明确指定列名,避免后续列顺序变动引发错误:

input_panel['target'] = input_panel.apply(lambda row: my_function(row['param1'], row['param3'], row['param2']), axis=1)

方案二:矢量化运算(性能最优选择)

如果my_function可以被修改为支持矢量化输入(即能直接处理Pandas Series或NumPy数组,而非单个行数据),那这是性能最高的方案——Pandas的矢量化操作是底层优化的,速度远快于逐行迭代:

假设my_function原本接受单个参数值,修改为接受数组参数后,你可以直接传入DataFrame的列:

# 假设my_function接受三个数组参数,对应DataFrame的三列
input_panel['target'] = my_function(input_panel['col1'], input_panel['col2'], input_panel['col3'])

这种方式完全避免了逐行循环,能最大化利用Pandas的性能优势,适合处理大规模数据集。

对比原实现的优势

  • 代码更简洁:去掉了冗余的循环、解构和拼接操作;
  • 性能更出色:apply()比iterrows()效率更高,矢量化操作更是碾压级的性能提升;
  • 可读性更强:逻辑清晰,一眼就能看出是给每行应用函数并生成结果列。

内容的提问来源于stack exchange,提问作者Lisa

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 06:37:09