循环处理多个DataFrame时如何消除PerformanceWarning告警?
问题描述
我需要为多个DataFrame重置索引,于是创建了容器列表并循环遍历每个DataFrame,但触发了PerformanceWarning。请问是否可以忽略该告警,或是有其他消除告警的方法?
代码示例:
df_list = [short_frml,mid_frml,long_frml] for x in df_list: x.reset_index(inplace=True)
告警信息:
PerformanceWarning: DataFrame is highly fragmented. This is usually the result of calling
frame.insertmany times, which has poor performance. Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, usenewframe = frame.copy()
告警处理方案
1. 是否可以忽略?
如果你的数据量不大,当前代码运行速度在可接受范围内,完全可以忽略这个告警。它只是性能提示,不会影响代码功能的正确性。
2. 消除告警的具体方法
方法一:复制DataFrame消除碎片化
按照告警提示,先对碎片化的DataFrame执行复制操作,再重置索引,从根源解决存储碎片化问题:
df_list = [short_frml, mid_frml, long_frml] for i in range(len(df_list)): # drop=False保留原索引列,不需要的话可以设为True df_list[i] = df_list[i].copy().reset_index(drop=False)
这种方式避免了原地修改碎片化的DataFrame对象,同时整理了内部存储结构。
方法二:临时禁用该类告警
如果只是不想看到这个提示,可以通过设置临时屏蔽PerformanceWarning:
import pandas as pd from warnings import filterwarnings # 精准禁用PerformanceWarning filterwarnings("ignore", category=pd.errors.PerformanceWarning) # 执行重置索引操作 df_list = [short_frml,mid_frml,long_frml] for x in df_list: x.reset_index(inplace=True)
注意:禁用后会错过其他同类型的性能提示,建议只在确认当前场景无问题时使用。
方法三:提前统一整理碎片化DataFrame
如果后续还要对这些DataFrame做大量操作,建议先统一复制整理所有对象,再进行后续处理:
# 先复制所有DataFrame,消除碎片化 df_list = [df.copy() for df in [short_frml, mid_frml, long_frml]] # 再循环重置索引 for df in df_list: df.reset_index(inplace=True)
内容的提问来源于stack exchange,提问作者stvlam22
相关产品推荐
相关产品推荐

