Pandas如何对两个DataFrame各列批量应用第三方函数
答复
逐列遍历方案的合理性
你当前采用的逐列遍历写法本身就是这类场景下的标准实现方案,没有问题。只要提前对齐两个DataFrame的列顺序、行索引,就不会出现计算错位,代码可读性也足够。你贴的示例代码存在一处笔误:for col_name in for df1.columns多写了一个冗余的for关键字,修正后即可正常运行:
def other_func(df1, df2): # 修正笔误后的遍历实现 scores = [package_func(df1[col_name], df2[col_name]) for col_name in df1.columns] return scores
关于"无需逐列遍历一次性计算"的说明
不存在真正意义上跳过逐列传参的实现方式——核心原因是你用的第三方package_func入参限制为两个一维列表,且单次调用仅返回单个标量结果,不管你用什么写法封装,最终都要把每一列的序列单独拆出来传给函数,不存在把整个二维DataFrame一次性传进去直接得到所有列结果的可能。
如果只是不想在代码里写显式的for循环,可以用Pandas内置的按列应用逻辑把迭代过程封装起来,写法更简洁:
import pandas as pd def other_func(df1, df2): return df1.apply(lambda col: package_func(col, df2[col.name]), axis=0)
注:这种写法本质还是逐列迭代计算,只是把循环逻辑交给Pandas内置方法处理,不会带来性能上的本质提升,和你自己写列表推导式的运行效率差异极小,选可读性更高的写法即可。
额外提示:如果后续你用到的第三方函数升级为支持二维数组批量输入、可以一次性返回多列计算结果,那时候才可以跳过逐列传参的步骤,直接把整个DataFrame转成numpy数组传入做向量化计算,获得明显的性能提升。但在当前函数的入参限制下,没有这类优化空间。
内容的提问来源于stack exchange,提问作者Denver Dang
相关产品推荐
相关产品推荐

