如何用pd.concat一次性生成DataFrame列,替代多次frame.insert?
解决DataFrame循环插入列的性能警告问题
核心解决方案
直接批量生成所有目标列对应的Series,再用pd.concat一次性合并,彻底避免循环插入带来的内存碎片化问题:
# 批量生成所有需要的列的Series column_series = [phiNT(M, i) for i in range(1, len(M.columns))] # 一次性合并为DataFrame并设置列名 A = pd.concat(column_series, axis=1) A.columns = range(1, len(M.columns))
可选:优化phiNT函数提升性能
原函数的部分操作可以简化,减少重复的DataFrame切片与拼接操作,进一步提升处理大数据的效率:
def phiNT(M, nT): # 截取前nT列数据 sub_df = M.iloc[:, :nT] # 直接让每列减去最后一列,再计算行均值 return sub_df.sub(sub_df.iloc[:, -1], axis=0).mean(axis=1)
原理说明
循环插入列时,每次操作都会修改原DataFrame的内存结构,导致内存碎片化,进而触发性能警告。而pd.concat是批量合并操作,会一次性分配连续内存空间,既消除了警告,也能显著提升6000行200列规模数据的处理速度。
内容的提问来源于stack exchange,提问作者Gigi
相关产品推荐
相关产品推荐

