提取文本文件B=行至CSV时填充缺失值的代码修改求助
处理含缺失值的B=行提取与CSV生成
现有文本文件包含多组如下格式内容:
G= rtc={22/06/30,18:32:30} B=52,12,13,4,T=421,29,29,4 Ba=28.32,Bs=15.26,Br=1.38,1.96,2.00,3.39 Ns=286,Nf=117,A=0,1,E=0需要提取所有以
B=开头的行,生成表头为B1,B2,B3,B4,T1,T2,T3,T4的CSV文件。但原数据部分目标行数值不足8个,存在缺失值,需修改代码在缺失位置填充nan,避免触发IndexError: list index out of range错误,替换原代码else块的pass语句。
原代码
def attrs_reader(file, attrs_columns): csvReader = csv.reader(file) list_of_lists = [] for line in csvReader: if len(line) == len(attrs_columns): list_of_lists.append([ re.sub('B=', '', line[0]), line[1], line[2], line[3], re.sub('T=', '', line[4]), line[5], line[6], line[7] ]) else: pass data = [] for i, lst in enumerate(list_of_lists): data.append(lst) df_attrs = pd.DataFrame(data, columns=attrs_columns) return df_attrs
修改后的代码
核心逻辑:统一处理每行的前缀,再将列表补全到目标长度,缺失位置填充缺失值标识。
import pandas as pd import re import csv def attrs_reader(file, attrs_columns): csvReader = csv.reader(file) list_of_lists = [] target_length = len(attrs_columns) # 固定为8 for line in csvReader: # 先处理所有元素,移除B=和T=前缀 processed_items = [] for item in line: if item.startswith('B='): processed_items.append(re.sub('B=', '', item)) elif item.startswith('T='): processed_items.append(re.sub('T=', '', item)) else: processed_items.append(item) # 补全到目标长度,缺失位置填充pd.NA(pandas标准缺失值) if len(processed_items) < target_length: processed_items += [pd.NA] * (target_length - len(processed_items)) # 若元素过多,截断至目标长度(按需保留) elif len(processed_items) > target_length: processed_items = processed_items[:target_length] list_of_lists.append(processed_items) # 直接用处理后的列表构造DataFrame df_attrs = pd.DataFrame(list_of_lists, columns=attrs_columns) return df_attrs
关键优化点
- 不再依赖行长度判断前缀处理,确保所有含
B=/T=的元素都能被正确清洗 - 自动补全缺失值,彻底避免索引越界错误
- 移除冗余的
data列表生成步骤,简化代码逻辑 - 用
pd.NA替代普通nan,更贴合pandas的缺失值处理规范
内容的提问来源于stack exchange,提问作者Roosha
相关产品推荐
相关产品推荐

