除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
相关产品推荐
相关产品推荐

