循环遍历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
相关产品推荐
相关产品推荐

