读取TXT文件ppm单列并以文件名命名列,解决DataFrame碎片化警告
实现方案
核心思路是先把所有处理好的列统一存入列表,最后一次性合并,既避免重复列名问题,也不会触发碎片化警告:
import glob import os import pandas as pd path = "你的文件目录路径" all_files = glob.glob(os.path.join(path, "*.txt")) # 初始化列表存储所有待合并的列 ppm_col_list = [] for file in all_files: file_name = os.path.basename(file) # 只读ppm列,将单列DataFrame转为Series后重命名为当前文件名 s = pd.read_csv(file, sep='\s+', header=0, usecols=['ppm']).squeeze("columns") s.name = file_name ppm_col_list.append(s) # 一次性合并所有列 df_final = pd.concat(ppm_col_list, axis=1)
关键说明
- 用
usecols=['ppm']只读需要的列减少内存占用,搭配squeeze("columns")把单列DataFrame转为更轻便的Series操作 - 循环内仅做读数据、重命名、存入列表的操作,不修改最终DataFrame,避免频繁内存重分配
- 仅调用一次
pd.concat完成全量列合并,完全符合pandas高性能操作规范,不会触发碎片化警告
原两种实现的问题说明:
- 第一种实现读取后没有修改列名就直接合并,导致所有列都保留原列名
ppm- 第二种实现循环内反复给已有DataFrame新增列,会触发多次内存拷贝和数据挪动,文件量较大时就会出现碎片化警告
如果需要兼容缺失ppm列的异常文件,可以修改循环逻辑增加异常捕获:
for file in all_files: file_name = os.path.basename(file) try: s = pd.read_csv(file, sep='\s+', header=0, usecols=['ppm']).squeeze("columns") s.name = file_name ppm_col_list.append(s) except ValueError: print(f"文件{file_name}中无ppm列,已跳过")
内容的提问来源于stack exchange,提问作者Anne
相关产品推荐
相关产品推荐

