Pandas用apply调用自定义年龄计算函数运行过久异常问题排查
问题原因分析
核心诱因
- pandas逐行
apply的性能缺陷:df.apply(lambda x: calc_age(x["yyyy"], x["mm"]), axis=1)属于Python层级的逐行遍历操作,每一行都要单独调用自定义函数,无法利用pandas内置的向量化运算优化。运行耗时随数据量线性增长,你提到抽样比例0.9时可正常执行,说明全量数据的量级刚好跨过了可快速执行的阈值,你感知到的“无法结束”本质是执行时间远超预期。 - Notebook环境的状态同步异常:执行其他单元格时原单元格显示
[1],是Jupyter类Notebook工具的前端UI和内核执行状态不同步导致的,内核已经完成计算但前端没有及时刷新执行标识,产生了代码仍在运行的错觉。 - 全量数据存在未覆盖的异常值:0.9比例的抽样数据中没有命中异常值,全量数据中可能存在
yyyy、mm列的非法取值(比如月份超出1-12范围、年份无效、空值等),datetime.strptime解析这类值时会抛出异常,若环境开启了全局异常静默配置,就会出现无报错但执行卡住的现象。
优化方案
替换逐行apply的写法,改用pandas向量化运算,执行效率可提升数百倍,同时能直接抛出异常值的明确报错:
import pandas as pd # 提前计算当前日期,避免重复运算 current_dt = pd.to_datetime("today") # 整列生成出生日期,向量化计算年龄 df["age"] = (current_dt - pd.to_datetime(df[["yyyy", "mm"]].assign(day=1))).dt.days // 365
内容的提问来源于stack exchange,提问作者Hiro Nakagame
相关产品推荐
相关产品推荐

