Pandas DataFrame.apply搭配lambda访问前一行已更新值的实现问题
问题原因
- pandas
apply方法的执行逻辑是先完成所有行的计算得到完整的结果序列,再统一赋值给目标列,计算过程中不会实时更新df_foo["bar"]的取值,因此你在func中读取的永远是计算启动前的初始列值,自然拿不到上一行的计算结果。 - lambda本身没有访问限制,问题出在
apply的执行赋值逻辑,和lambda无关。
保留现有结构的解决方案
你可以引入一个可变的中间容器(比如列表)来存储已经计算好的行结果,利用可变对象引用传递的特性实现实时读取上一行结果,修改后的代码如下:
函数定义
def func(row, res_container): i = row.name try: # 直接从中间容器拿上一行已计算完成的结果 new_row = res_container[i-1] + row.name # 可替换为你的实际计算逻辑 except: new_row = 1 res_container.append(new_row) return new_row
调用方式
# 初始化空的中间结果容器 res_list = [] df_foo["bar"] = df_p1.apply(lambda row: func(row, res_list), axis=1)
说明
- 该方案完全保留了你原有的
apply+lambda+自定义func的整体结构,仅调整了结果存储和读取的载体 - 中间容器
res_list会随着每行计算实时追加最新结果,第i行计算时res_container[i-1]就是上一行已经计算完成的结果 - 你原有测试用的try/except逻辑可直接复用,不需要修改索引管理逻辑
内容的提问来源于stack exchange,提问作者logicOnAbstractions
相关产品推荐
相关产品推荐

