PAYATHON 2026

Pandas 如何使用列名列表选择多列并解决 KeyError?

数据小许

使用 data.loc[:, colsel] 或 data[colsel] 选择这些列。data.loc[colsel] 会把 colsel 当作行标签查找,因此报 KeyError。错误信息中的换行与本次错误无关。

正确的列选择方式

在已有的 data 上执行:

colsel = [
    'coastal_blue', 'yellow', 'rededge', 'CCI',
    'green_i', 'EVI', 'CCCI', 'nir',
    'NDRE', 'blue', 'red', 'MSAVI'
]

selected = data.loc[:, colsel]

.loc 的二维选择形式是:

data.loc[row_selector, column_selector]

逗号前的 : 表示保留所有行,逗号后的 colsel 指定要选择的列。结果 selected 是一个 DataFrame,所选列按 colsel 中的顺序排列。

对于这里的列名列表,也可以直接写:

selected = data[colsel]

这两种写法都适用于题目给出的数据。

为什么原来的写法会报错

下面的代码只向 .loc 提供了行选择条件:

data.loc[colsel]

Pandas 会在 data.index 中查找 'coastal_blue'、'yellow' 等标签。这些标签在 data.columns 中,却不在行索引中,因此报错末尾显示:

are in the [index]

将代码改为 data.loc[:, colsel],即可明确指定列轴。

报错中的换行需要处理吗

这里的换行来自 Pandas 对较长 Index 的格式化显示。给出的报错在元素之间和 dtype 前换行,没有显示列名内部有换行符,不能据此判断列名字符串包含换行符。

x.strip() 可以移除字符串两端的空白,但不会改变 .loc 选择的轴,因此无法解决本次错误。

改正后仍报 KeyError 怎么检查

列选择要求 colsel 中的名称存在于 data.columns。如果改正后仍然报错,可以检查缺失的列名:

missing = [name for name in colsel if name not in data.columns]
print(missing)

根据题目展示的列表和列索引,这些列名均已列出。如果实际运行时 missing 非空,再检查拼写、大小写或不可见字符。需要查看字符串的具体表示时,可以使用 repr(name)。

备注:内容仅供参考。