You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 13:27:52