使用pandarallel库parallel_apply时遇NameError错误求助
问题原因
pandarallel启动子进程执行并行任务时,子进程的命名空间不会自动包含主进程中定义的函数。你用lambda嵌套调用ponerfecha时,子进程只能拿到lambda代码,却找不到ponerfecha的定义,因此抛出NameError。而普通apply在主进程单线程执行,不存在命名空间隔离问题,所以能正常运行。
解决方案
直接将ponerfecha函数作为参数传给parallel_apply,无需用lambda包裹。同时建议把datetime的导入移到函数外部,避免每次调用都重复导入模块,提升执行效率。
修正后的完整代码:
import datetime import pandas as pd from pandarallel import pandarallel # 初始化pandarallel(必须步骤,否则无法启用并行) pandarallel.initialize(nb_workers=4) # 可根据CPU核心数设置worker数量 def ponerfecha(row): return datetime.datetime(2023, 9, 10, row['HORA'], row['MINUTO']) data = {'HORA': [10, 12, 15], 'MINUTO': [30, 45, 0]} CargaT = pd.DataFrame(data) # 直接传递函数给parallel_apply,无需lambda CargaT['FECHATRX'] = CargaT.parallel_apply(ponerfecha, axis=1) print(CargaT)
运行后即可得到预期输出:
HORA MINUTO FECHATRX 0 10 30 2023-09-10 10:30:00 1 12 45 2023-09-10 12:45:00 2 15 0 2023-09-10 15:00:00
补充说明
如果需要给函数传递额外参数,可以使用functools.partial封装函数和固定参数,示例如下:
from functools import partial def ponerfecha(row, year, month, day): return datetime.datetime(year, month, day, row['HORA'], row['MINUTO']) # 封装固定日期参数 ponerfecha_with_date = partial(ponerfecha, year=2023, month=9, day=10) # 并行调用封装后的函数 CargaT['FECHATRX'] = CargaT.parallel_apply(ponerfecha_with_date, axis=1)
内容的提问来源于stack exchange,提问作者FG85
相关产品推荐
相关产品推荐

