如何将DataFrame前一行的值传入apply()函数?
在Pandas的apply()中获取前一行数据构建新列
你可以直接在apply()中通过行索引结合df.loc来访问前一行的a列值,不需要额外创建偏移列。下面是针对你需求的实现方式:
基础实现(Lambda表达式)
import pandas as pd l1 = [1,2,3,4,5] l2 = [3,2,5,4,6] df = pd.DataFrame(data=l1, columns=['a']) df['b'] = l2 # 直接在apply中获取前一行的a值,第一行无前置行返回pd.NA df['c'] = df.apply(lambda row: df.loc[row.name - 1, 'a'] + row['b'] if row.name > 0 else pd.NA, axis=1) print(df)
输出结果:
a b c 0 1 3 <NA> 1 2 2 3.0 2 3 5 7.0 3 4 4 7.0 4 5 6 10.0
复杂条件场景(自定义函数)
针对你提到的需要条件判断的实际场景,可以封装自定义函数,并将整个DataFrame作为参数传入apply(),方便在函数内灵活访问前一行数据:
def calculate_c(row, df): # 处理第一行无前置行的情况 if row.name == 0: return pd.NA prev_a = df.loc[row.name - 1, 'a'] # 这里添加你的条件判断逻辑 if prev_a >= 3: return prev_a + row['b'] + 1 # 示例:前一行a>=3时,结果加1 else: return prev_a + row['b'] df['c_custom'] = df.apply(calculate_c, args=(df,), axis=1) print(df)
输出结果:
a b c c_custom 0 1 3 <NA> <NA> 1 2 2 3.0 3.0 2 3 5 7.0 7.0 3 4 4 7.0 8.0 4 5 6 10.0 11.0
关键说明
row.name代表当前行的索引,通过row.name - 1即可定位到前一行的索引- 使用
df.loc[索引, 列名]可以精准获取前一行的指定列值 - 自定义函数需要通过
args=(df,)将DataFrame传入,这样函数内部才能访问整个数据集进行逻辑判断
内容的提问来源于stack exchange,提问作者Nili
相关产品推荐
相关产品推荐

