pandas逐行迭代满足条件后停止 实现lifetimes库RCP指标计算
错误原因
- 调用逻辑错位:你执行
df.apply(approximate(RCP, model = mbgf, rfm = df), axis = 1)时,会先直接运行approximate函数得到一个Series,再把这个Series传给apply,完全不符合逐行调用的预期。 - 变量作用域错误:
RCP函数依赖全局变量t,迭代过程中无法动态传入不同的t值。 - 布尔判断歧义:
approximate函数内的cf += df.apply(fn, axis = 1)会生成Series,后续if(cf - eps < eps_tol)是对整个Series做比较,pandas无法判定整段条件的布尔值,因此抛出你遇到的报错。
修正代码
你需要把迭代逻辑下沉到单行维度,每行独立计算总RCP,修改后的代码如下:
import pandas as pd # 计算单周期增量RCP def calculate_incremental_rcp(t, row, model): return (model.conditional_expected_number_of_purchases_up_to_time(t, row['frequency'], row['recency'], row['T']) - model.conditional_expected_number_of_purchases_up_to_time(t-1, row['frequency'], row['recency'], row['T'])) # 单行计算总RCP,直到增量低于阈值 def calculate_total_rcp(row, model, eps_tol=1e-6): total_rcp = 0 current_t = 1 while True: incr = calculate_incremental_rcp(current_t, row, model) if incr < eps_tol: break total_rcp += incr current_t += 1 return total_rcp # 逐行计算生成总RCP列 df['t_RCP'] = df.apply(lambda x: calculate_total_rcp(x, model=mbgf), axis=1)
补充说明
修正后所有循环和判断都在单行标量维度运行,不存在Series布尔判断歧义问题,也符合你逐行处理直到单客户增量RCP达标的需求。如果数据量较大,可以进一步优化为向量化运算提升效率,不需要逐行迭代。
内容的提问来源于stack exchange,提问作者BeDeliberate
相关产品推荐
相关产品推荐

