求助:将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_Type | Material_Category | Material_Name | Material_Description |
|---|---|---|---|
| _accurender | Masonry | Brick | Brown,_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
相关产品推荐
相关产品推荐

