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

如何改写代码避免DataFrame插入移位复制列时触发PerformanceWarning?

解决Pandas添加移位列时的PerformanceWarning警告

你遇到的PerformanceWarning: DataFrame is highly fragmented when adding more columns警告,是因为循环中逐列添加新列会让DataFrame的内存结构变得碎片化——Pandas每次新增列都要调整底层存储,多次操作后就会触发这个警告,而每次copy()虽然能临时解决,但确实会浪费性能。

下面是两种更高效的解决方案:

方案一:预先生成所有列的字典,一次性构建完整DataFrame

先把原数据和所有需要的移位列都整理成一个字典,再一次性转成DataFrame,从根源避免碎片化问题:

import pandas as pd

# 生成原始数据字典
data = {str(i): [pow(k, i) for k in range(1000)] for i in range(1, 6)}

# 扩展字典,加入所有移位列
for col in list(data.keys()):  # 遍历原始列的副本,避免遍历过程中修改字典
    for offset in range(1, 30):
        # 生成移位后的列表,直接加入字典
        shifted_vals = [None] * offset + data[col][:-offset]
        data[f'{col}-{offset}'] = shifted_vals

# 一次性构建DataFrame
df = pd.DataFrame.from_dict(data)

方案二:用pd.concat批量合并移位列

先收集所有移位后的Series,再和原DataFrame一次性合并,减少内存结构的频繁调整:

import pandas as pd

data = {str(i): [pow(k, i) for k in range(1000)] for i in range(1, 6)}
df = pd.DataFrame.from_dict(data)

# 收集所有移位列
shifted_cols = []
for col in df.columns:
    for offset in range(1, 30):
        shifted_series = df[col].shift(offset).rename(f'{col}-{offset}')
        shifted_cols.append(shifted_series)

# 批量合并到原DataFrame
df = pd.concat([df] + shifted_cols, axis=1)

这两种方法都是通过减少DataFrame的修改次数来避免内存碎片化,性能远优于循环添加后再copy的方式。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 04:12:36