Python Pandas按标签访问数据触发KeyError问题求助
解决Pandas读取CSV后按标签访问触发KeyError的问题
我来帮你拆解下这个问题,其实是两个小细节没注意到导致的:
1. 问题根源解析
首先,你的CSV里的列名是用单引号包裹的,而且字段之间是逗号加空格分隔的。Pandas默认的read_csv参数不会自动处理这些单引号和空格,所以导入后的列名其实是带单引号和空格的(比如实际列名是'First'而非你预期的First),这直接导致你用'First'作为标签访问时找不到对应列。
另外,你用test.loc['First']的时候踩了个loc的用法坑:loc的第一个参数是行标签,第二个才是列标签。你的行索引是默认的数字序列(0、1...),自然找不到行标签'First',这就是报错提示“标签不在索引里”的直接原因。
2. 具体解决方案
方案一:调整read_csv参数自动解析列名
这是最简便的方法,直接在读取时告诉Pandas如何处理引号和空格:
import pandas as pd test = pd.read_csv('test.csv', quotechar="'", skipinitialspace=True)
quotechar="':指定单引号为字段的包裹符,Pandas会自动去掉列名和数据里的单引号skipinitialspace=True:忽略逗号后面的空格,避免列名或数据前出现多余空格
导入后你可以用print(test.columns)验证,列名会变成干净的First、Name等,之后:
- 访问
First列:test['First']或者test.loc[:, 'First'] - 访问第0行的
First列:test.loc[0, 'First']
都能正常返回结果了。
方案二:手动处理列名(适配特殊格式CSV)
如果CSV格式过于特殊,方案一没生效,可以手动提取并修正列名:
import pandas as pd # 先把所有内容当成数据导入,不设置列名 test = pd.read_csv('test.csv', header=None) # 提取第一行作为列名,去掉单引号和前后空格 new_columns = [col.strip("' ").strip() for col in test.iloc[0]] # 设置新列名 test.columns = new_columns # 删除原来的第一行(旧列名行) test = test.iloc[1:] # 重置索引 test.reset_index(drop=True, inplace=True)
处理完后列名就完全符合预期,后续的标签访问不会再出错。
3. 快速验证方法
不管用哪种方案,导入后先执行print(test.columns)和test.head()确认列名是否正确,这是排查这类问题的关键步骤。
内容的提问来源于stack exchange,提问作者deMangler
相关产品推荐
相关产品推荐

