You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

除iloc/loc/lambda外遍历Pandas行处理时序数据的替代方案

替代遍历的Pandas行处理方案

对于你描述的场景,优先推荐使用Pandas内置向量化函数实现,完全不需要手动逐行遍历,性能远高于iloc/loc遍历和lambda逐行处理,代码也更简洁不易出错。

需求实现代码

按照你给出的规则,两列的实现代码如下:

import pandas as pd
import numpy as np 

dataset = [(2, 4, 6, 43, np.nan, np.nan, np.nan, np.nan),
           (10, 12, 14, np.nan, np.nan, np.nan, np.nan, np.nan),
           (20, 22, 24, 4, np.nan, np.nan, 4, np.nan),
           (10, 12, 14, np.nan, np.nan, np.nan, 4, np.nan),
           (10, 12, 14, np.nan, np.nan, np.nan, 4, np.nan),
           (20, 22, 24, 60, np.nan, np.nan, 60, 4),
           (10, 12, 14, np.nan, np.nan, np.nan, 60, 4),
           (10, 12, 14, np.nan, np.nan, np.nan, 60, 4),
           (20, 22, 24, 13, np.nan, np.nan, 13, 60),
           (10, 12, 14, np.nan, np.nan, np.nan, 13, 60),
           (20, 22, 24, 26, np.nan, np.nan, 26, 13),
           (28, 30, 32, np.nan, np.nan, np.nan, 26, 13)]

df = pd.DataFrame(dataset, columns = ("A", "B", "C", "D", "1 prev D", "2 prev D", "1 prev D example", "2 prev D example" ))

# 实现1 prev D example规则:D为空则取上方最近的非空D值
df['1 prev D example'] = df['D'].ffill()

# 实现2 prev D example规则:取上上个非空D值,空值向前填充
# 先提取D列所有非空值,偏移1位得到上一个非空值
non_null_d = df['D'].dropna()
prev2_values = non_null_d.shift(1)
# 映射回原DataFrame的非空D行
df.loc[df['D'].notna(), '2 prev D example'] = prev2_values
# 空值向前填充
df['2 prev D example'] = df['2 prev D example'].ffill()

其他通用替代方案

如果处理逻辑更复杂,内置函数无法直接覆盖,可以选择以下方案替代手动iloc/loc遍历:

  • 按列使用apply处理:优先针对单列做批量处理,性能远高于逐行apply
  • 使用itertuples遍历:如果必须逐行处理,df.itertuples()的速度是iterrows()的3~10倍,可以直接通过属性名读取每列的值
  • 转换为Numpy数组处理:数值型数据可以转为numpy数组后再做运算,避免Pandas行遍历的额外开销

内容的提问来源于stack exchange,提问作者sloth288

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 22:39:04