Python面板数据设置索引报错:指定列存在却提示不存在
问题描述
执行命令df.set_index(['id', 'datas'], inplace=True)时,反复收到KeyError:"None of ['id', 'datas'] are in the columns",但肉眼确认这两列存在于DataFrame中。完整报错信息如下:
--------------------------------------------------------------------------- KeyError Traceback (most recent call last) <ipython-input-4-219574cda450> in <module> 1 # Configurando o painel ----> 2 df.set_index(['id', 'datas'], inplace=True) 3 4 # Realizando a regressão POLS 5 X_pols = df[['perc_qtd_neg_lei', 'ampl_log_0', 'distperc_vwap_inicio_lei', 'segunda', 'terca', 'quarta', 'sexta']] ~\anaconda3\lib\site-packages\pandas\core\frame.py in set_index(self, keys, drop, append, inplace, verify_integrity) 4549 4550 if missing: -> 4551 raise KeyError(f"None of {missing} are in the columns") 4552 4553 if inplace: KeyError: "None of ['id', 'datas'] are in the columns"
原因分析
- 列名存在空格或隐藏字符:肉眼看到的
id/datas,实际列名可能带有前后空格(比如id、datas)或不可见的特殊字符(如制表符、换行符),导致代码中的列名与实际列名不匹配。 - 前期操作修改了DataFrame:执行
set_index前的代码可能误删了这两列,或者使用inplace=True的操作(如drop、rename)改变了列的存在状态。 - 大小写不匹配:实际列名可能是大小写不同的形式(比如
ID、Datas),而代码中用的是全小写的id、datas。
解决方法
- 验证列名的精确值:执行
print(df.columns.tolist())查看所有列的真实名称,直接复制输出中的正确列名替换代码里的id和datas;如果是空格问题,执行df.columns = df.columns.str.strip()批量去除所有列名的前后空格。 - 回溯代码流程:检查
set_index之前的所有代码,确认没有删除列的操作;或者在操作前先备份DataFrame:df_backup = df.copy(),对副本进行操作避免原数据被意外修改。 - 统一列名大小写:如果是大小写问题,要么修改代码中的列名与实际一致,要么执行
df.columns = df.columns.str.lower()将所有列名转为小写(或str.upper()转为大写),再执行set_index。
内容的提问来源于stack exchange,提问作者Marcel
相关产品推荐
相关产品推荐

