循环中高效合并不等长列表至Dataframe(解决性能警告)
解决Pandas DataFrame碎片化警告的高效合并方案
核心思路
避免循环内反复修改DataFrame列结构导致的内存碎片化,先将list2处理为与list1列数匹配的结构化数据,再通过批量赋值/一次性合并的方式添加到原DataFrame中。
具体实现方法
方法1:字典生成法(循环内轻量高效)
先给list2的子列表补0至list1的长度,再按列名生成字典,最后批量赋值给原DataFrame,仅触发一次结构修改:
import pandas as pd # 初始数据 list1 = ['col1', 'col2', 'col3', 'col4'] list2 = [[1, 2, 3], [2, 3], [1, 8, 4, 3], [22, 35, 32], [65], [2, 45, 55]] df = pd.DataFrame([['Alex', 33, 'Male'], ['Marly', 28, 'Female'], ['Charlie', 30, 'Female'], ['Mimi', 37, 'Female'], ['James', 44, 'Male'], ['Jone', 25, 'Male']], columns=['Name', 'Age', 'Gender']) # 循环内通用处理逻辑(支持每次循环更新list1、list2) def update_merge(df, new_cols, new_rows): # 给每行补0到目标列数 padded_rows = [row + [0]*(len(new_cols)-len(row)) for row in new_rows] # 生成列名对应数据的字典 col_data = {col: [row[i] for row in padded_rows] for i, col in enumerate(new_cols)} # 批量赋值,仅修改一次DataFrame结构 df[new_cols] = pd.DataFrame(col_data, index=df.index) return df # 调用示例(模拟循环更新场景) df = update_merge(df, list1, list2) print(df)
方法2:Numpy预处理法(大数据量更高效)
用Numpy的pad函数批量补0,再转成DataFrame一次性合并,适合数据量较大的场景:
import numpy as np def update_merge_np(df, new_cols, new_rows): target_len = len(new_cols) # 批量补0生成二维数组 padded_arr = np.array([np.pad(row, (0, target_len - len(row)), mode='constant') for row in new_rows]) # 生成与原df索引对齐的新列DataFrame new_df = pd.DataFrame(padded_arr, columns=new_cols, index=df.index) # 一次性合并,避免多次修改 df = df.join(new_df) return df # 调用示例 df = update_merge_np(df, list1, list2)
为什么能解决碎片化警告?
直接循环调用df[list1] = ...会频繁修改DataFrame的内存布局,导致Pandas触发碎片化警告。上述方法都是先准备好所有新列的完整数据,再一次性完成合并/赋值,仅触发一次DataFrame结构调整,彻底避免了内存碎片化问题。
内容的提问来源于stack exchange,提问作者Arwa
相关产品推荐
相关产品推荐

