如何将多页堆叠文本文件高效转换为Pandas DataFrame
高效合并多页堆叠文本到Pandas DataFrame
核心思路
不需要手动创建大量单独的DataFrame,而是通过批量解析+分组合并的方式,利用Pandas原生的concat、groupby和pivot_table功能,一次性完成数据整理,既简洁又高效。
具体实现步骤
1. 读取文件并拆分页面
先将整个文件按空行拆分为独立页面,过滤掉无效的空内容:
import pandas as pd # 读取目标文本文件 with open('your_data.txt', 'r', encoding='utf-8') as f: file_content = f.read() # 按空行拆分页面,清理空白块 pages = [page.strip() for page in file_content.split('\n\n') if page.strip()]
2. 批量解析页面数据
遍历每个页面,提取TEST、MATERIAL标识,同时将表格数据转为DataFrame,并添加标识列用于后续分组:
processed_dfs = [] for page in pages: lines = page.split('\n') # 提取当前页面的TEST和MATERIAL信息(固定为第2、3行) current_test = lines[1].strip() current_material = lines[2].strip() # 读取表格数据(从第4行开始,按|分隔并清理空格) table_data = '\n'.join(lines[3:]) page_df = pd.read_csv( pd.io.common.StringIO(table_data), sep='|', skipinitialspace=True, engine='python' ) # 添加分组标识列 page_df['TEST'] = current_test page_df['MATERIAL'] = current_material processed_dfs.append(page_df) # 合并所有页面的DataFrame full_df = pd.concat(processed_dfs, ignore_index=True)
3. 按TEST-MATERIAL组合合并数据
通过groupby分组后,将同一组合下的所有数据按Angle合并为宽表,这里提供两种高效方式:
方式一:利用分组合并
def merge_single_group(group): # 同一Angle下的Body列合并,保留第一个有效值(因为同Angle数据一致) merged = group.groupby('Angle').first().reset_index() return merged # 分组并应用合并逻辑 final_df = full_df.groupby(['TEST', 'MATERIAL']).apply(merge_single_group).reset_index(drop=True)
方式二:长格式转宽格式(更直观)
# 转成长格式,便于后续透视 long_format_df = full_df.melt( id_vars=['TEST', 'MATERIAL', 'Angle'], var_name='Body_Column', value_name='Value' ) # 透视转为宽表 final_df = long_format_df.pivot_table( index=['TEST', 'MATERIAL', 'Angle'], columns='Body_Column', values='Value', aggfunc='first' ).reset_index()
优势说明
- 避免手动遍历创建大量DataFrame,减少内存开销和代码冗余
- 利用Pandas内部优化的分组、合并逻辑,处理大规模数据时效率远高于手动方法
- 代码结构清晰,易于维护和扩展(比如新增TEST或MATERIAL类型时无需修改核心逻辑)
内容的提问来源于stack exchange,提问作者DLH
相关产品推荐
相关产品推荐

