You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于位置解析固定宽度文本至DataFrame的高效方法(大文件场景)

高效解析固定宽度文本生成DataFrame

问题场景

现有从TXT文件读取的字符串列表,每条元素是包含多变量的固定宽度格式数据样本;另有一个辅助DataFrame定义了每个变量的1-based起始位置、长度和名称。需要高效处理5万行数据、600+变量的场景,避免低效的Python循环,生成结构化的目标DataFrame。

示例数据

  • 待解析的字符串列表:
txt = [
     '001   0198110',
     '0020130198110',
     '0030132198110',
]
  • 辅助定义变量规则的DataFrame:
import pandas as pd
df = pd.DataFrame(data=[[1,3,"A"],[4,3,"B"],[7,6,"C"]],columns=["Position","Lenght","Name"])
  • 目标解析结果:
A   B       C
0   1   NaN     198110
1   2   13      198110
2   3   13     2198110

高效解决方案

利用pandas内置的read_fwf(固定宽度格式读取)方法,该方法基于矢量化操作实现,完全避免Python级别的循环,适合大规模数据处理。

步骤1:生成列位置规格

将辅助DataFrame中的1-based起始位置转换为pandas要求的0-based区间(左闭右开):

# 计算每个变量的起始、结束索引(0-based)
colspecs = [(pos - 1, pos - 1 + length) for pos, length in zip(df['Position'], df['Lenght'])]
# 获取变量名称列表
names = df['Name'].tolist()

步骤2:将字符串列表转为可读取的流对象

把字符串列表拼接成按换行分隔的文本流,供read_fwf读取:

import io
txt_stream = io.StringIO('\n'.join(txt))

步骤3:解析生成目标DataFrame

# 读取固定宽度数据,先按字符串类型保留原始格式
df_result = pd.read_fwf(txt_stream, colspecs=colspecs, names=names, dtype=str)
# 将空字符串转为缺失值,再转换为数值类型匹配目标格式
df_result = df_result.replace('', pd.NA).apply(pd.to_numeric, errors='ignore')

方案优势

  • 性能高效:read_fwf基于pandas底层的C优化实现,处理5万行+600变量的场景,速度远快于Python循环;
  • 代码简洁:无需手动编写循环逻辑,仅需几行代码完成规则转换与解析;
  • 扩展性强:变量数量从3个扩展到600+时,代码无需修改,仅需辅助DataFrame的规则定义正确即可。

内容的提问来源于stack exchange,提问作者gabboshow

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 22:35:27