Pandas Shift优化方案求助:批量移位与提速方法
问题1:一次性完成多周期移位操作
可以用列表推导式+pd.concat批量生成移位列,避免重复编写shift语句,代码更简洁高效:
import pandas as pd import numpy as np # 构造原始DataFrame df = pd.DataFrame(np.array([[1, 0, 0], [4, 5, 0], [7, 7, 7], [7, 4, 5], [4, 5, 0], [7, 8, 9], [3, 2, 9], [9, 3, 6], [6, 8, 5]]), columns=['a', 'b', 'c'], index = ['1/1/2000', '1/1/2001', '1/1/2002', '1/1/2003', '1/1/2004', '1/1/2005', '1/1/2006', '1/1/2007', '1/1/2008']) # 定义需要的移位周期 shift_periods = [1, 3, 5, 7] # 批量生成所有移位列并合并到原DataFrame shifted_columns = pd.concat( [df['a'].shift(p).rename(f'a_{p}') for p in shift_periods], axis=1 ) df = pd.concat([df, shifted_columns], axis=1)
如果需要对多列执行相同的多周期移位,只需把df['a']改成遍历目标列的循环即可。
问题2:大规模DataFrame的高效移位实现(除Numba外)
方法1:直接操作NumPy底层数组
Pandas的shift会有封装层开销,直接用NumPy数组切片拼接的方式速度更快,尤其数据量越大优势越明显:
arr = df['a'].values shift_periods = [1, 3, 5, 7] shifted_series = [] for p in shift_periods: # 前p个位置补NaN,后面取原数组的[:-p]部分 shifted_arr = np.concatenate([np.full(p, np.nan), arr[:-p]]) shifted_series.append(pd.Series(shifted_arr, index=df.index, name=f'a_{p}')) shifted_columns = pd.concat(shifted_series, axis=1) df = pd.concat([df, shifted_columns], axis=1)
方法2:分布式计算框架(Dask/PySpark)
如果数据集大到单机器内存无法容纳,用Dask或PySpark这类分布式框架拆分数据并行处理,语法和Pandas兼容,自动分片执行移位操作,能大幅提升处理速度。比如Dask的用法:
import dask.dataframe as dd # 用Dask加载数据(支持大文件分片) ddf = dd.read_csv('large_data.csv') # 批量生成移位列 shift_periods = [1,3,5,7] for p in shift_periods: ddf[f'a_{p}'] = ddf['a'].shift(p) # 计算并导出结果 result = ddf.compute()
内容的提问来源于stack exchange,提问作者Lata
相关产品推荐
相关产品推荐

