如何解决根据索引列表选取DataFrame列时的索引不存在报错?
解决“none of them are in the index”报错的方案
嘿,这个报错我之前也碰到过,主要是索引的使用逻辑出了问题,咱们一步步梳理解决:
1. 先修正变量名的笔误
你定义的索引变量是indices = full_train_df.query("primary == primary").index,但后面代码里用的是clean_df_indices——变量名不统一,先把这个小问题改了,比如统一用indices。
2. 核心解决方法:别用切片,改用.loc按索引取值
你写的[:indices]是按整数位置切片,但indices是从DataFrame里拿到的索引值(可能不是连续整数,或者和train_df的索引范围不匹配),这就导致系统找不到对应位置,报错“无对应索引”。
正确的做法是用.loc来精准匹配索引,代码改成这样:
# 按索引选取指定行的A、B列 X = train_df.loc[indices, ["A", "B"]].values # 按索引选取指定行的year列 y = train_df.loc[indices, "year"].values
.loc是专门用来按索引标签取值的,完美适配你拿到的索引列表。
3. 检查两个DataFrame的索引是否匹配
如果改了.loc还是报错,那大概率是full_train_df和train_df的索引不匹配——比如一个是重置过的连续整数索引,另一个是原始的非连续索引,或者两个表的行对应关系不对。
这时候可以先验证一下:
# 检查两个DataFrame的索引是否完全一致 print(full_train_df.index.equals(train_df.index))
如果输出是False,那你要么调整两个表的索引让它们对齐,要么直接从train_df本身筛选索引(如果业务逻辑允许的话):
# 直接从train_df里获取符合条件的索引 indices = train_df[train_df["primary"].notna()].index
4. 小优化:简化索引筛选逻辑
你写的query("primary == primary")其实是筛选primary列非空的行,可以简化成更高效的写法:
indices = full_train_df[full_train_df["primary"].notna()].index
最后,整合后的正确代码大概是这样:
# 获取符合条件的索引(确保和train_df索引匹配) indices = full_train_df[full_train_df["primary"].notna()].index # 按索引选取数据 X = train_df.loc[indices, ["A", "B"]].values y = train_df.loc[indices, "year"].values
内容的提问来源于stack exchange,提问作者01110000_01110000
相关产品推荐
相关产品推荐

