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

如何更快地从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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 23:35:22