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

如何避免DataFrame插入操作以提升性能?pd.concat实现方法求教

解决DataFrame碎片化的优化方案

解决这个性能警告的核心思路是不要在循环里逐列往DataFrame中插入数据,而是先把所有要添加的列(即每个图片对应的特征Series)存入一个列表,最后一次性合并。同时还可以优化你的灰度计算逻辑,用numpy向量运算替代低效的Python循环。

优化后的完整代码

import pandas as pd
import numpy as np
from skimage.io import imread

# 初始化空列表,存储所有图片的特征Series
feature_series_list = []

for i in range(1000):
    try:
        image = imread(f"Images/{i}.jpg")
        # 用numpy向量运算直接计算灰度,比三重循环效率高数十倍
        # axis=2表示在RGB通道维度上取均值
        feature_matrix = image.mean(axis=2)
        # 展平为一维并转为Series,指定列名为当前图片编号
        features = pd.Series(feature_matrix.flatten(), name=f"{i}")
        # 将Series存入列表,而非直接插入DataFrame
        feature_series_list.append(features)

    except Exception as e:
        # 捕获异常并打印,方便排查出错的图片
        print(f"处理图片{i}时出错: {e}")
        pass

# 一次性合并所有Series为DataFrame,彻底解决碎片化问题
df = pd.concat(feature_series_list, axis=1)
df.to_csv("Features.csv")

关键改动说明

  • 避免循环修改DataFrame:用列表暂存所有特征Series,最后通过pd.concat一次性合并,从根源消除碎片化警告
  • 大幅提升灰度计算效率:把原来的三重Python循环替换为image.mean(axis=2),numpy的底层C实现比纯Python循环快几个数量级
  • 规范异常处理:替换bare except为except Exception as e,方便定位具体出错的图片
  • 自动设置列名:给每个Series指定name参数,合并后列名自动对应图片编号,无需额外处理

内容的提问来源于stack exchange,提问作者FKNweeb

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 14:21:02