如何更优雅地实现将函数应用于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
相关产品推荐
相关产品推荐

