pandas循环merge触发DataFrame碎片化性能警告如何优化
问题根因
你收到的DataFrame is highly fragmented性能警告,根因是在循环中逐次执行pd.merge()新增列,本质是反复调用frame.insert方法写入数据,这会让DataFrame的内存块变得零散,运算效率会随着循环次数增加快速下降。
修复方案
方案1:先收集所有待合并表,一次性完成合并(推荐)
完全规避循环合并的碎片化问题,性能提升最明显:
- 第一步:初始化空列表存储所有待合并的DataFrame,把初始的
df_out先存入列表
dfs = [] dfs.append(df_out)
- 第二步:循环过程中不再直接执行merge,只把生成的
tmp存入列表
# 你的原有for循环逻辑 for 循环变量 in 遍历对象: # 生成tmp的原有代码不变 ... dfs.append(tmp)
- 第三步:循环结束后,用
functools.reduce一次性完成多表按Date的outer合并
from functools import reduce df_out = reduce( lambda left, right: pd.merge( left, right, on='Date', how='outer', sort=False, copy=False ), dfs )
方案2:临时抑制警告(仅适合小数据量临时场景)
如果你的数据量很小,碎片化带来的性能影响可以忽略,可以加代码临时抑制该类警告:
import warnings from pandas.errors import PerformanceWarning warnings.filterwarnings("ignore", category=PerformanceWarning)
注意:该方案没有解决内存碎片化的根本问题,数据量变大后依然会出现明显卡顿,不推荐长期使用
额外代码修复点
你原有merge代码中sort="false"、copy="false"的写法是错误的,这两个参数需要接收布尔值而非字符串,传字符串"false"会被pandas判定为True,不符合你的预期,需要改为sort=False、copy=False。
内容的提问来源于stack exchange,提问作者Andrea
相关产品推荐
相关产品推荐

