Pandas DataFrame仅能选中首列,其余列按名访问报KeyError求助
解决TSV文件列名隐藏特殊字符导致的KeyError问题
哈哈,这个坑我之前也踩过!你遇到的核心问题是列名里藏着看不见的特殊字符——从你打印的Index(['date', 'time', 'user_id', 'url', 'IP'], dtype='object')就能看出来:除了第一个date,其他列名前面都有个零宽空格(Unicode U+200B)之类的不可见字符,所以你用"time"去索引自然找不到,实际列名是time(前面多了个隐藏字符)。
给你几个实用的解决办法:
1. 先确认列名的真实字符编码
先跑这段代码,把每个列名的字符编码打出来,就能揪出那些隐藏的家伙:
for col in df.columns: print(f"列名: '{col}', 字符编码列表: {[ord(c) for c in col]}")
比如time列的编码里会多一个8203(零宽空格的编码),而正常的date列编码只有d,a,t,e对应的数值。
2. 批量清理列名中的特殊字符
用正则表达式过滤掉所有非打印的特殊字符,直接替换成干净的列名:
import re # 移除所有不可见控制字符和零宽空格 df.columns = [re.sub(r'[\x00-\x1f\x7f-\x9f\u200b-\u200f]', '', col) for col in df.columns]
或者更简单的,只保留可打印字符:
df.columns = [''.join(c for c in col if c.isprintable()) for col in df.columns]
执行完之后,再打印df.columns,应该就能看到干净的Index(['date', 'time', 'user_id', 'url', 'IP'], dtype='object')了,此时用df.loc[:, "time"]就不会报错啦。
3. 读取文件时直接指定列名(快速 workaround)
如果你已经明确知道正确的列名,也可以在读取TSV的时候直接指定names参数,跳过原文件的问题列名:
df = pd.read_csv( 'abc.tsv', delimiter="\t", engine="python", encoding="UTF-8", names=['date', 'time', 'user_id', 'url', 'IP'], header=0 # 表示原文件第一行是列名,我们用指定的names替换它 )
这个方法更直接,适合你已经清楚列名的情况。
内容的提问来源于stack exchange,提问作者Aman Rathi
相关产品推荐
相关产品推荐

