已使用pd.concat仍触发DataFrame高度碎片化警告的原因及解决方法
Pandas中DataFrame碎片化警告的异常场景与解决方法
为避免"DataFrame is highly fragmented"警告,已采用pd.concat进行拼接,但在拼接后的DataFrame中添加新列时,部分场景仍会触发该警告,具体场景如下:
- 案例a:拼接一个空DataFrame与多个Series后添加新列,触发警告
- 案例b:仅拼接多个Series后添加新列,无警告
- 案例c:拼接多个DataFrame后添加新列,触发警告
复现代码
import pandas as pd import sys print(sys.version) # 3.8.11 print('pandas version: ',pd.__version__) # pandas version: 2.0.3 list_of_series = [pd.Series([1,2,3]) for i in range(200)] a = pd.DataFrame() a = pd.concat([a]+list_of_series,axis=1) a['one_more_col'] = [4,5,6] # concating one df with many series incurs warning b = pd.concat(list_of_series,axis=1) b['one_more_col'] = [4,5,6] # concating series only. It's fine. c = pd.concat([pd.DataFrame(x) for x in list_of_series],axis=1,) c['one_more_col'] = [4,5,6] # concating many dataframes incurs warning
疑问
- 为何这三种场景会出现差异?
- 若已有拼接后的DataFrame,添加新列应如何操作?是否需要再次使用
pd.concat?
注:本问题与Stack Overflow某问题不同,该问题中
pd.concat可避免警告,但本场景下拼接后添加列仍会触发案例a和c的警告。
解决方案
问题已解决:感谢@Timus和@jtobelem的解答,使用newframe = df.copy()可消除碎片化,推测df.assign()因内部调用copy也有效,虽仍疑惑案例c的触发原因,但这两种方法可解决问题。
内容的提问来源于stack exchange,提问作者user16865829
相关产品推荐
相关产品推荐

