在已有DataFrame中高效添加移位列的优化方案
高效生成DataFrame移位列的方法
你遇到的性能警告是因为循环中逐个添加列会频繁触发DataFrame的内存重组,尤其是1000万行的数据集,365次列插入操作会导致数据碎片化,大幅降低性能。
优化方案:一次性合并所有移位列
核心思路是先批量生成所有移位后的Series,再用pd.concat一次性合并到原DataFrame,避免多次内存调整:
import pandas as pd lst1 = range(10000000) df = pd.DataFrame(lst1, columns=['mw']) lagSize = 365 # 批量生成所有移位后的列 shifted_columns = [ df['mw'].shift(i).rename(f"mw_{i}_-1") for i in range(1, lagSize + 1) ] # 一次性合并到原DataFrame df = pd.concat([df] + shifted_columns, axis=1)
为什么这个方法更快?
- 原循环中每次执行
df[new_col] = ...都会调用DataFrame的insert方法,每次插入都要重新调整内存布局,365次操作的开销累积极大; - 先批量生成所有移位Series,再用
pd.concat一次性合并,只需要一次内存布局调整,性能提升非常明显,同时避免了数据碎片化问题。
如果合并后仍存在碎片化提示,可执行df = df.copy()强制重新整理内存,但上述方案已经从根源减少了碎片化的产生。
内容的提问来源于stack exchange,提问作者utkarsh saraf
相关产品推荐
相关产品推荐

