如何更快地从TXT文件创建指定格式的Pandas DataFrame?
优化G-code转DataFrame的高效实现
针对你处理200k+行G-code文件时的性能问题,核心原因是逐行使用df.loc[j]赋值的方式效率极低——pandas的DataFrame是为批量/向量化操作设计的,逐行修改会触发频繁的内存重新分配,时间复杂度接近O(n²),自然会耗时超1小时。下面提供几种高效的替代方案,处理速度能提升几十甚至上百倍:
方案1:字典列表批量构造DataFrame(最小代码改动)
直接把每行数据整理成字典,收集成列表后一次性生成DataFrame,再补全目标列并填充0:
import pandas as pd # 假设lines是你已读取的每行字符串列表 data_list = [] for line in lines: points = line.split() # 用字典推导式快速生成每行的键值对(字母为键,数字部分为值) line_dict = {item[0]: item[1:] for item in points} data_list.append(line_dict) # 批量生成临时DataFrame,再对齐目标列并填充0 temp_df = pd.DataFrame(data_list) # 替换成你预先定义的所有字母列列表 target_columns = ['G', 'X', 'Y', 'E', 'M', 'Q', 'S'] df = temp_df.reindex(columns=target_columns).fillna(0).astype(float)
为什么更快?
- 避免了逐行修改DataFrame的昂贵操作,所有数据在内存中构造完成后一次性生成结构,时间复杂度为O(n)
- 字典推导式比手动zip生成字典的效率更高
方案2:正则提取+Pivot转宽表(更灵活稳定)
如果G-code格式偶尔有异常(比如字母后多空格、特殊字符),用正则匹配单个字母+数字的模式更可靠,再通过pivot转成宽表:
import pandas as pd import re # 匹配单个大写字母+后续数字(支持小数)的正则 pattern = re.compile(r'([A-Z])([\d.]+)') all_records = [] for row_idx, line in enumerate(lines): # 提取当前行所有字母-数字对 matches = pattern.findall(line.strip()) for letter, value in matches: all_records.append({ 'row_id': row_idx, 'letter': letter, 'value': float(value) }) # 转成长表后再 pivot 为宽表 long_df = pd.DataFrame(all_records) df = long_df.pivot( index='row_id', columns='letter', values='value' ).fillna(0) # 对齐目标列顺序(可选) df = df.reindex(columns=target_columns).fillna(0)
优势:
- 正则匹配能兼容更多格式异常情况,鲁棒性更强
pivot是pandas的向量化操作,处理大数量级数据时效率极高
方案3:逐行读取+生成器(低内存占用)
如果文件过大,内存无法容纳完整的lines列表,用生成器逐行读取处理,避免一次性加载全部内容:
import pandas as pd def parse_gcode(file_path): with open(file_path, 'r', encoding='utf-8') as f: for line in f: line = line.strip() if not line: continue points = line.split() yield {item[0]: item[1:] for item in points} # 直接从生成器生成DataFrame temp_df = pd.DataFrame(parse_gcode('your_file.txt')) df = temp_df.reindex(columns=target_columns).fillna(0).astype(float)
效果对比
- 原逐行赋值方式:200k行耗时约1小时
- 方案1/2/3:处理200k行仅需1-5分钟(取决于硬件性能)
内容的提问来源于stack exchange,提问作者Ethan Seiler
相关产品推荐
相关产品推荐

