Pandas DataFrame碎片化警告处理:用pd.concat实现自定义列名
解决方案
你遇到的碎片化警告是因为循环调用列插入导致的,只需要先把所有待拼接的列预处理后一次性合并即可,既可以保留自定义列名规则,也能保留指定列筛选逻辑,完整实现如下:
import pandas as pd import numpy as np # 模拟你的原始字典数据 dic = {} for i in np.arange(0,10): dic[str(i)] = pd.DataFrame(np.random.randint(0,1000,size=(5000, 20)), columns=list('ABCDEFGHIJKLMNOPQRST')) # 第一步:定义你需要保留的列和对应要转换的数据类型 cols_needed = { 'A': 'int', 'D': 'int', 'H': 'int', 'I': 'int', 'M': 'int', 'O': 'int', 'Q': 'int', 'R': 'int', 'S': 'int', 'T': 'int', 'C': 'int' } # 第二步:收集所有预处理后的待拼接DataFrame dfs_to_concat = [] for dic_key, df in dic.items(): # 筛选指定列,批量给列加后缀(后缀为字典的键,对应你原来的str(i)) tmp_df = df[list(cols_needed.keys())].add_suffix(f'_{dic_key}') # 按要求转换列类型 tmp_df = tmp_df.astype(cols_needed) dfs_to_concat.append(tmp_df) # 第三步:一次性拼接所有列,无碎片化问题 df_out = pd.concat(dfs_to_concat, axis=1)
方案说明
- 没有在循环中反复修改DataFrame,所有预处理逻辑只生成临时DataFrame存入列表,最后只做一次合并操作,完全规避性能警告
- 保留了指定列筛选逻辑,只需要修改
cols_needed字典即可调整需要提取的列和对应数据类型 - 列名规则和你原有逻辑完全一致,为
原列名_字典键的格式
内容的提问来源于stack exchange,提问作者plonfat
相关产品推荐
相关产品推荐

