如何改写代码避免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
相关产品推荐
相关产品推荐

