如何将空格排版的纯文本表格转为Python的pandas DataFrame?
实现步骤与代码
1. 核心思路
由于文本文件中的表格仅靠空格排版,且包含多个时间维度的独立表格,我们需要先拆分这些表格,再逐个解析为小DataFrame,最后合并成目标结构的大DataFrame。
2. 完整代码实现
import pandas as pd # 读取文本文件,过滤空行 with open('your_data.txt', 'r') as f: lines = [line.strip() for line in f if line.strip()] # 拆分多个表格:以时间标题(含Three/Nine Months Ended)作为分隔标志 tables = [] current_table = [] for line in lines: if 'Three Months Ended' in line or 'Nine Months Ended' in line: if current_table: tables.append(current_table) current_table = [line] else: current_table.append(line) if current_table: tables.append(current_table) # 逐个解析表格并合并 merged_df = None for table in tables: time_column = table[0] # 用空格分隔数据行,生成单时间维度的DataFrame single_df = pd.read_csv( pd.io.common.StringIO('\n'.join(table[1:])), sep='\s+', names=['部门/团队', time_column] ) # 合并到总DataFrame,保留所有部门 if merged_df is None: merged_df = single_df else: merged_df = pd.merge(merged_df, single_df, on='部门/团队', how='outer') # 处理缺失值(按需替换为0或NaN) merged_df = merged_df.fillna(0) # 排序时间列(按时间逻辑调整顺序) time_columns = [col for col in merged_df.columns if col != '部门/团队'] time_columns_sorted = sorted(time_columns, key=lambda x: (x.split()[0], x.split()[-1])) merged_df = merged_df[['部门/团队'] + time_columns_sorted] # 调整到20行数据:不足补空行,过多截断 if len(merged_df) < 20: empty_rows = pd.DataFrame( [[''] + [0]*len(time_columns_sorted)]*(20 - len(merged_df)), columns=merged_df.columns ) merged_df = pd.concat([merged_df, empty_rows], ignore_index=True) elif len(merged_df) > 20: merged_df = merged_df.head(20) # 输出结果 print(merged_df)
3. 关键细节说明
- 表格拆分:通过识别包含
Three Months Ended或Nine Months Ended的行作为每个表格的标题,将文本拆分为独立的表格块。 - 数据解析:使用
pd.read_csv结合sep='\s+'处理任意数量的空格分隔,自动识别数据列。 - 合并逻辑:用
outer合并保留所有部门,避免丢失数据;缺失值可根据业务需求替换为0或保留NaN。 - 行数调整:通过添加空行或截断,确保最终DataFrame恰好有20行。
内容的提问来源于stack exchange,提问作者Prometheus
相关产品推荐
相关产品推荐

