向Pandas DataFrame添加列触发性能警告,求pd.concat优化方案
解决Pandas插入多列触发的PerformanceWarning问题
问题原因
每次通过df_result[col_name] = data单独添加列,都会导致DataFrame内部结构碎片化,Pandas因此抛出性能警告,这种方式的运行效率也极低。
正确的pd.concat用法
核心思路是一次性准备好所有要添加的列,再合并到原DataFrame,具体分两种场景处理:
场景1:AlbedoSurf_irradiance是数组/Series的列表
先将每个元素转为带指定列名的Series(需确保索引与原DataFrame一致,避免值错位),再批量合并:
import pandas as pd # 1. 批量生成带列名的Series列表 cols_to_add = [] for idx, data in enumerate(AlbedoSurf_irradiance): col_name = f"Albedo_Surface_Irradiance_{idx} [W/m²]" new_col = pd.Series(data, name=col_name, index=df_result.index) cols_to_add.append(new_col) # 2. 一次性合并原DataFrame和所有新列 df_result = pd.concat([df_result] + cols_to_add, axis=1)
也可以用更简洁的列表推导式实现:
cols_to_add = [ pd.Series(data, name=f"Albedo_Surface_Irradiance_{i} [W/m²]", index=df_result.index) for i, data in enumerate(AlbedoSurf_irradiance) ] df_result = pd.concat([df_result] + cols_to_add, axis=1)
场景2:AlbedoSurf_irradiance本身是DataFrame
直接重命名原有列后合并即可:
# 批量重命名列 AlbedoSurf_irradiance.columns = [ f"Albedo_Surface_Irradiance_{i} [W/m²]" for i in AlbedoSurf_irradiance.columns ] # 一次性合并到原DataFrame df_result = pd.concat([df_result, AlbedoSurf_irradiance], axis=1)
为什么之前的尝试无效
你之前用df_result[[col1, col2,...]] = (data1, data2)的方式,右侧是元组结构,Pandas无法将其正确解析为匹配列的二维数据格式,因此无法生效。必须确保待添加的列是DataFrame或多个Series的集合,而pd.concat正好适配这种批量合并场景。
碎片化后的结构修复
如果已经出现DataFrame碎片化问题,可通过以下代码整理结构:
df_result = df_result.copy()
内容的提问来源于stack exchange,提问作者E. M.
相关产品推荐
相关产品推荐

