使用Pandas读取CSV时出现KeyError: 'Service'问题求助
处理NSL-KDD数据集时的KeyError问题
我是Python数据分析课程的新手,在处理NSL-KDD数据集时遇到问题。已尝试更换不同的pandas和numpy版本,当前版本为pandas 1.3.5、numpy 1.21.6。train.head()能正常显示所有列,但调用train['Service'].value_counts()时触发KeyError,详情如下:
错误信息
KeyError Traceback (most recent call last) ~\AppData\Roaming\Python\Python37\site-packages\pandas\core\indexes\base.py in get_loc(self, key, method, tolerance) 3360 try: -> 3361 return self._engine.get_loc(casted_key) 3362 except KeyError as err: ~\AppData\Roaming\Python\Python37\site-packages\pandas\_libs\index.pyx in pandas._libs.index.IndexEngine.get_loc() ~\AppData\Roaming\Python\Python37\site-packages\pandas\_libs\index.pyx in pandas._libs.index.IndexEngine.get_loc() pandas\_libs\hashtable_class_helper.pxi in pandas._libs.hashtable.PyObjectHashTable.get_item() pandas\_libs\hashtable_class_helper.pxi in pandas._libs.hashtable.PyObjectHashTable.get_item() KeyError: 'Service' The above exception was the direct cause of the following exception: KeyError Traceback (most recent call last) ~\AppData\Local\Temp\ipykernel_25872\2219816057.py in <module> ----> 1 train['Service'].value_counts() ~\AppData\Roaming\Python\Python37\site-packages\pandas\core\frame.py in __getitem__(self, key) 3456 if self.columns.nlevels > 1: 3457 return self._getitem_multilevel(key) -> 3458 indexer = self.columns.get_loc(key) 3459 if is_integer(indexer): 3460 indexer = [indexer] ~\AppData\Roaming\Python\Python37\site-packages\pandas\core\indexes\base.py in get_loc(self, key, method, tolerance) 3361 return self._engine.get_loc(casted_key) 3362 except KeyError as err: -> 3363 raise KeyError(key) from err 3364 3365 if is_scalar(key) and isna(key) and not self.hasnans: KeyError: 'Service'
我的代码
# 获取特征名用于重命名所有列 features = pd.read_csv('NSL-KDD Features - Sheet2.csv') def rename_column(dataframe): df = dataframe.rename(columns = features['Feature Name']) return df # 导入用于加载和修改文本文件、数据框的库 import pandas as pd # 设置选项以查看数据框的完整结果 pd.set_option('display.max_rows', 100000) # 加载训练、测试数据并重命名列名 def load_data(): train = pd.read_csv('KDDTrain+.txt', sep=',', header=None) train = rename_column(train) print(train) test = pd.read_csv('KDDTest+.txt', sep=",", header=None) test = rename_column(test) return train, test train, test = load_data()
解决建议
- 检查特征名列表:在
rename_column函数前后添加print(features['Feature Name'].tolist()),确认列表中是否包含'Service',以及是否存在拼写错误、大小写差异或前后空格。 - 验证重命名后的列名:调用
print(train.columns.tolist())输出所有列名,确认'Service'是否存在,排查是否有格式问题(如空格、特殊字符)。 - 匹配列数与特征数:对比
len(features['Feature Name'])和train.shape[1]的结果,确保特征名的数量与数据集的列数完全一致,避免部分列未被重命名。 - 清理列名空格:如果列名存在前后空格,执行
train.columns = train.columns.str.strip()去除空格后,再尝试访问train['Service']。 - 用位置索引验证:尝试通过位置访问目标列(如
train.iloc[:, 2].value_counts(),假设Service是第3列,索引从0开始),确认该列数据是否正常。
内容的提问来源于stack exchange,提问作者Mohammed
相关产品推荐
相关产品推荐

