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

求助:将materials.txt转换为Pandas DataFrame时遇错误或NaN

解决TXT文件转Pandas DataFrame时的错误/NaN问题

问题说明

尝试将materials.txt转换为Pandas DataFrame时出现错误或NaN值,需要修正解析逻辑以匹配数据格式。

样本数据

_accurender\Ceiling\Acoustic Tile_Standard, Gray,  2' x 2' Generic-051
_accurender\Ceiling\Acoustic Tile_Standard, White,  2' x 2'    Generic-013
_accurender\Ceiling\Acoustic Tile_Standard, White,  2' x 4'    Generic-011
_accurender\Ceramic Tile\Mosaic\Square\2"_Salmon,High Gloss    Ceramic-043
_accurender\Concrete\Exposed Aggregate, Pink    Concrete-028
_accurender\Concrete\Exposed Aggregate, Tan Concrete-029
_accurender\Exterior\Shakes\Roofing,Shake,Square, Non-Uniform Weathering    Generic-052
_accurender\Masonry\Brick\Brown, Non-uniform,_8",Running    Masonry-030
_accurender\Masonry\Brick\Brown,_8",Soldier Masonry-029

现有代码问题

原代码使用sep=';',但数据中根本没有分号作为分隔符,导致Pandas将整行内容放入第一列,其余列全部为NaN:

df = pd.read_csv('materials.txt', sep=';', header=None,names=['Revit_type', 'Material_Category', 'Material_Name', 'Material_Description'], encoding = 'latin')

期望DataFrame结构

Material_TypeMaterial_CategoryMaterial_NameMaterial_Description
_accurenderMasonryBrickBrown,_8",Soldier Masonry-029

解决方案

由于数据分隔规则不统一(混合反斜杠、逗号、空格),需要自定义解析逻辑逐行处理:

步骤1:定义解析函数

def parse_line(line):
    line = line.strip()
    # 按反斜杠分割路径部分
    parts = line.split('\\')
    material_type = parts[0] if parts else ''
    
    category = ''
    material_name = ''
    description = ''
    
    if len(parts) >= 3:
        category = parts[1]
        name_section = parts[2]
        # 拆分名称和描述(以第一个逗号为界)
        if ',' in name_section:
            material_name, desc_part = name_section.split(',', 1)
            material_name = material_name.strip()
            # 拼接剩余路径部分和描述内容
            extra_desc = ' '.join(parts[3:]).strip()
            description = f"{desc_part.strip()} {extra_desc}".strip()
        else:
            material_name = name_section.strip()
            description = ' '.join(parts[3:]).strip()
    elif len(parts) == 2:
        category = parts[1].strip()
    
    return (material_type, category, material_name, description)

步骤2:读取文件并解析

import pandas as pd

# 读取文件内容
with open('materials.txt', 'r', encoding='latin') as f:
    lines = [line for line in f if line.strip()]  # 过滤空行

# 解析所有行
parsed_data = [parse_line(line) for line in lines]

# 创建目标DataFrame
df = pd.DataFrame(
    parsed_data,
    columns=['Material_Type', 'Material_Category', 'Material_Name', 'Material_Description']
)

# 查看结果
print(df.head())

解析逻辑说明

  • 按反斜杠\拆分每行内容,提取固定前缀_accurender作为Material_Type
  • 第二部分作为Material_Category
  • 第三部分中,以第一个逗号为界拆分出Material_Name和描述的起始部分
  • 剩余路径片段和描述部分拼接为Material_Description
  • 兼容不同长度的路径结构(如包含多级子分类的行)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 22:57:21