从URL导入UCI的MPG数据集时Carname列为NaN的原因及解决方案
问题原因
- 原始MPG数据集的
Carname列本身包含内部空格,你当前配置的单空格分隔+合并连续空格的规则,会把Carname内部的单个空格也识别为列分隔符,导致实际解析出来的列数远多于你定义的9列,pandas会自动丢弃多余列,你定义的Carname列没有对应匹配的数据,就被统一填充为NaN。 - 你添加的
comment='\t'参数属于冗余配置,原始数据不存在制表符开头的注释内容,该参数反而会干扰正常的字段解析逻辑。
修复方案
有两种常用的修复方式,任选其一即可:
方案1:调整分隔符规则
将分隔符设置为两个及以上的空格(原始数据的数值列之间都是用多个空格分隔,仅Carname内部为单个空格),同时指定python解析引擎支持正则分隔符:
import pandas as pd # 从URL导入原始数据集 url = 'http://archive.ics.uci.edu/ml/machine-learning-databases/auto-mpg/auto-mpg.data' column_names = ['MPG', 'Cylinders', 'Displacement', 'Horsepower', 'Weight', 'Acceleration', 'Model Year', 'Origin', 'Carname'] data = pd.read_csv(url, names=column_names, na_values='?', sep=r'\s{2,}', # 匹配2个及以上空格作为分隔符 engine='python') data.head(3)
方案2:使用固定宽度文件读取接口
该数据集本质是固定宽度格式的文本,直接用pandas的read_fwf接口读取更稳妥,不需要手动配置分隔符:
import pandas as pd url = 'http://archive.ics.uci.edu/ml/machine-learning-databases/auto-mpg/auto-mpg.data' column_names = ['MPG', 'Cylinders', 'Displacement', 'Horsepower', 'Weight', 'Acceleration', 'Model Year', 'Origin', 'Carname'] data = pd.read_fwf(url, names=column_names, na_values='?') data.head(3)
内容的提问来源于stack exchange,提问作者user4933
相关产品推荐
相关产品推荐

