如何将行分隔错误的CSV数据正确解析并存入pandas DataFrame
解决波士顿数据集行拆分导致的pandas解析问题
问题根源
该数据集的部分完整数据行(包含14个特征)被错误拆分为两行存储,直接用pd.read_csv按行读取时,拆分后的行因列数不足14会被填充NaN,导致无法匹配预设列名。
方法一:预处理文本合并拆分行(最稳妥)
先读取原始文本,将被拆分的不完整行合并为完整的14列数据行,再导入pandas:
import pandas as pd from io import StringIO # 读取原始数据文件,跳过前21行说明文字 with open("boston.data", "r") as f: lines = f.readlines()[21:] processed_lines = [] current_line = "" for line in lines: stripped = line.strip() if not stripped: continue # 拼接当前行到临时变量 current_line += f" {stripped}" # 统计当前已拼接的数值数量 value_count = len(current_line.strip().split()) # 达到14个数值则为完整行,存入列表并重置临时变量 if value_count == 14: processed_lines.append(current_line.strip()) current_line = "" # 将处理后的文本转为可读取对象,生成DataFrame data_stream = StringIO("\n".join(processed_lines)) df = pd.read_csv( data_stream, sep=r"\s+", names=["CRIM", "ZN", "INDUS", "CHAS", "NOX", "RM", "AGE", "DIS", "RAD", "TAX", "PTRATIO", "B", "LSTAT", "MEDV"] ) # 验证结果 print(df.head()) print(f"NaN值数量:{df.isna().sum().sum()}")
方法二:固定宽度格式读取(备选)
如果数据集的拆分是严格按固定宽度进行的,可直接用pd.read_fwf读取,无需预处理:
import pandas as pd df = pd.read_fwf( "boston.data", skiprows=21, names=["CRIM", "ZN", "INDUS", "CHAS", "NOX", "RM", "AGE", "DIS", "RAD", "TAX", "PTRATIO", "B", "LSTAT", "MEDV"] )
注意:若数据行的拆分宽度不统一,此方法可能失效,优先选择方法一。
内容的提问来源于stack exchange,提问作者Jaiv Burman
相关产品推荐
相关产品推荐

