pandas按name列筛选DataFrame正常,按sn列筛选报KeyError如何修复
问题产生原因
执行df.set_index('sn', inplace=True)代码时,pandas默认会将sn列从普通数据列移除,设置为DataFrame的行索引。此时sn不属于df.columns的列集合,因此使用列取值语法df['sn']时,pandas无法在列中找到对应字段,直接抛出KeyError: 'sn'异常。name字段始终是普通数据列,从未被设置为索引,因此df['name']的取值逻辑可以正常运行。
排查这类列不存在的KeyError时,可以先执行
print(df.columns)查看当前所有有效列名,执行print(df.index)确认当前索引内容,快速定位问题。
修复方案
根据实际使用场景,任选以下一种方案即可:
- 方案1:直接按行索引做筛选,不需要取列
针对索引做等值匹配可以直接用.loc定位,代码如下:
纯等值匹配场景可以简化写法,直接传入索引值列表:# 匹配索引值为'016'的行 df.loc[df.index == '016']df.loc[['016']] - 方案2:设置索引时保留原
sn列
如果既需要用sn做索引,又需要保留该列做筛选,可以在set_index时传入drop=False参数:# 重新设置索引,设置时保留sn作为普通列 df.set_index('sn', inplace=True, drop=False) # 后续即可正常使用列筛选语法 df[df['sn'] == '016'] - 方案3:将索引重置为普通列后再筛选
如果不需要sn作为行索引,可以直接重置索引,把sn转回普通数据列:# 重置索引,sn恢复为普通列 df.reset_index(inplace=True) # 执行原筛选语句即可正常运行 df[df['sn'] == '016']
内容的提问来源于stack exchange,提问作者JJJohn
相关产品推荐
相关产品推荐

