如何在Pandas中基于前一行差值条件生成新DataFrame?
Pandas实现行值条件更新逻辑
需求明确
- 原始数据:名为
Position的Pandas DataFrame,包含13列、约8000行数据 - 更新规则:
- 新DataFrame首行所有值硬编码为0
- 从第二行开始,仅当当前行原始值与新DataFrame前一行对应值的差值绝对值大于1时,使用当前行原始值;否则沿用新DataFrame前一行的值
正确实现代码
方法1:使用itertools.accumulate(高效推荐)
import pandas as pd from itertools import accumulate # 定义核心判断逻辑 def update_rule(prev_result, curr_raw): return curr_raw if abs(curr_raw - prev_result) > 1 else prev_result # 对每一列应用累积更新规则 new_df = Position.apply( lambda col: pd.Series(accumulate([0] + col.tolist(), update_rule)[1:]) )
方法2:逐行遍历(适合理解逻辑,性能略低)
如果需要更直观的逐行处理逻辑,可以用以下代码:
import pandas as pd # 初始化新DataFrame,首行设为0 new_df = pd.DataFrame([[0]*len(Position.columns)], columns=Position.columns) # 从第二行开始逐行处理 for idx in range(1, len(Position)): prev_row = new_df.iloc[idx-1] curr_row = Position.iloc[idx] # 对每个元素应用规则 new_row = curr_row.where(abs(curr_row - prev_row) > 1, prev_row) new_df = pd.concat([new_df, new_row.to_frame().T], ignore_index=True)
关键逻辑说明
- 为什么不能直接用
Position.shift()?因为原始数据的前一行不是我们需要的新DataFrame的前一行结果,规则依赖的是上一步的计算值,而非原始数据的历史值,必须用累积计算的方式(accumulate就是干这个的) accumulate([0] + col.tolist(), update_rule):给列数据开头加一个0作为初始值,保证首行结果为0;处理后去掉第一个初始值,得到与原始行数匹配的结果- 两种方法中,
accumulate的性能远高于逐行遍历,适合处理8000行的大数据量
内容的提问来源于stack exchange,提问作者nk123
相关产品推荐
相关产品推荐

