如何避免Python中pandas.DataFrame访问不存在键时的KeyError?
避免DataFrame查找不存在键时抛出KeyError的方法
当然可以避免这种KeyError搞崩程序的情况!我给你几个实用的方案,刚好适配你用到的xs()和loc()操作:
- 方法一:用try-except捕获异常(通用方案)
这是最灵活的处理方式,不管用xs()还是loc()都能适配,还能自定义找不到时的默认值:
import pandas as pd try: v = datevar.xs('2000-01-01', level='date') except KeyError: # 找不到时返回空DataFrame,也可以改成空Series或者其他你需要的默认值 v = pd.DataFrame() # 针对loc的写法同理 try: v = datevar.loc['2000-01-01', :] except KeyError: v = pd.DataFrame()
- 方法二:先检查索引是否存在再操作
这种方式更直观,提前判断要找的键在不在索引里,从根源避免触发异常:
# 针对loc的情况 if '2000-01-01' in datevar.index: v = datevar.loc['2000-01-01', :] else: v = pd.DataFrame() # 针对xs的情况,先确认索引层级对应的键存在 if '2000-01-01' in datevar.index.get_level_values('date'): v = datevar.xs('2000-01-01', level='date') else: v = pd.DataFrame()
- 方法三:用布尔索引筛选(模拟数据库返回空表)
如果想完全复刻数据库返回空表的行为,直接用布尔索引筛选符合条件的行,找不到就自动返回空DataFrame:
# 不管用xs还是loc,都可以用这种方式替代 v = datevar[datevar.index == '2000-01-01']
- 方法四:用reindex处理loc操作
针对loc(),还可以用reindex()方法,它会返回包含指定索引的结果,不存在的索引对应值为NaN,之后可以再过滤掉空行:
v = datevar.loc.reindex(['2000-01-01']) # 去掉全为空的行,得到纯空的DataFrame v = v.dropna(how='all')
内容的提问来源于stack exchange,提问作者acneyouth
相关产品推荐
相关产品推荐

