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)。
备注:内容仅供参考。
