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

循环中高效合并不等长列表至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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 09:05:10