Pandas用同一布尔掩码筛选两个DataFrame索引不匹配报错如何解决
错误原因
- 报错的核心原因是你用来做筛选的布尔序列(来自
X_oos_top_10["comm"] == 1)的索引,和y_oos_top_10的索引不一致,pandas做布尔索引时要求索引对齐,所以抛出了该错误。
解决方法
方法1:先对齐索引(推荐,适合两个DataFrame行顺序本来就是一一对应的场景)
如果两个DataFrame本来是同一份数据集拆分出的特征集和标签集,逐行对应,先把y的索引替换成和X一致的,再筛选即可:
# 对齐y的索引和X一致 y_oos_top_10 = y_oos_top_10.set_axis(X_oos_top_10.index, axis=0) # 再用布尔序列正常筛选 y_oos_top_10_comm1 = y_oos_top_10[X_oos_top_10["comm"] == 1]
方法2:转numpy数组跳过索引对齐
确认两个DataFrame行数一致、行顺序完全对应时,可以直接把布尔序列转成numpy数组,绕开pandas的索引对齐校验:
# 旧版本pandas用.values y_oos_top_10_comm1 = y_oos_top_10[(X_oos_top_10["comm"] == 1).values] # pandas 1.0+版本推荐用更规范的.to_numpy() y_oos_top_10_comm1 = y_oos_top_10[(X_oos_top_10["comm"] == 1).to_numpy()]
方法3:用位置索引筛选
同样适合行顺序完全对应的场景,取布尔序列为True的位置下标,用iloc筛选:
mask = X_oos_top_10["comm"] == 1 y_oos_top_10_comm1 = y_oos_top_10.iloc[mask[mask].index]
注意:使用后两种方法前务必确认两个DataFrame行数一致、行顺序严格一一对应,否则筛选出的结果会出现错位问题。
内容的提问来源于stack exchange,提问作者user17361224
相关产品推荐
相关产品推荐

