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

循环遍历DataFrame创建新列触发碎片化警告,寻求优化方案

优化大型DataFrame循环创建新列的方案

问题原因

循环中反复向DataFrame添加列会触发PerformanceWarning: DataFrame is highly fragmented,本质是每次添加列都会导致内存重新分配,对于大型DataFrame来说,这种频繁操作会让内存布局碎片化,既影响性能也会触发警告。

优化思路

避免逐列循环赋值,改为批量计算所有新列,再一次性合并到原DataFrame,减少内存重新分配的次数。

具体实现代码

方案1:批量构建新列字典后合并

import pandas as pd

categories = ['All Industries, All firms',
              'All Industries, Large firms']

# 预先构建所有新列的计算结果
new_columns = {}
for category in categories:
    # 计算OP利润率
    op_col = f"{category}, OP, SA, JPY bn"
    sales_col = f"{category}, Sales, SA, JPY bn"
    new_columns[f"{category}, OP margin, %"] = sa[op_col] / sa[sales_col] * 100
    
    # 计算普通利润率
    ord_profit_col = f"{category}, Ordinary profits, SA, JPY bn"
    income_col = f"{category}, Operating and non-operating income, SA, JPY bn"
    new_columns[f"{category}, Ordinary profit margin, %"] = sa[ord_profit_col] / sa[income_col] * 100

# 一次性合并新列到原DataFrame
sa = pd.concat([sa, pd.DataFrame(new_columns)], axis=1)

方案2:用字典推导式简化代码

如果想更简洁,可以用字典推导式一次性生成所有新列的DataFrame:

new_columns = pd.DataFrame({
    f"{cat}, OP margin, %": sa[f"{cat}, OP, SA, JPY bn"] / sa[f"{cat}, Sales, SA, JPY bn"] * 100,
    f"{cat}, Ordinary profit margin, %": sa[f"{cat}, Ordinary profits, SA, JPY bn"] / sa[f"{cat}, Operating and non-operating income, SA, JPY bn"] * 100
    for cat in categories
})

sa = pd.concat([sa, new_columns], axis=1)

额外优化建议

  • 如果原DataFrame有大量不再需要的列,先通过sa.drop(columns=unused_cols)删除,减少内存占用
  • 确保计算过程中使用的列都是数值类型,避免隐式类型转换带来的性能损耗

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 20:35:16