You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

修复IndexingError:按房屋类型识别房价异常值的索引对齐问题

解决按分组识别房价异常值时的IndexingError问题

问题原因

你遇到的IndexingError是因为布尔Series和原DataFrame的索引不匹配:

  • 你对df["price"]和upper_bound[df["Type"]]执行了reset_index(drop=True),生成的布尔Series索引是从0开始的连续整数,但原df的索引还是初始状态(可能是非连续或非0起始的)。
  • pandas在使用布尔Series筛选DataFrame时会严格对齐索引,索引不匹配就会触发报错。

解决方案

不需要手动重置索引,利用pandas的分组映射特性,让每个房屋类型对应的上下界自动匹配到每一行,生成和原df索引一致的布尔Series即可。

方案1:使用map匹配分组上下界

grouped = df.groupby('Type')
q1 = grouped["price"].quantile(0.25)
q3 = grouped["price"].quantile(0.75)
iqr = q3 - q1

upper_bound = q3 + (1.5 * iqr)
lower_bound = q1 - (1.5 * iqr)

# 通过map将每个Type对应的上下界映射到df的每一行
is_outlier = (df["price"] > df["Type"].map(upper_bound)) | (df["price"] < df["Type"].map(lower_bound))
outliers = df[is_outlier]
print(outliers)

方案2:使用transform直接生成每行的上下界(更直观)

这种方式会在原df中生成临时列,方便查看每个样本对应的异常值判断依据:

# 按Type分组,为每行计算对应的四分位数、IQR和上下界
df['q1'] = df.groupby('Type')['price'].transform(lambda x: x.quantile(0.25))
df['q3'] = df.groupby('Type')['price'].transform(lambda x: x.quantile(0.75))
df['iqr'] = df['q3'] - df['q1']
df['upper_bound'] = df['q3'] + 1.5 * df['iqr']
df['lower_bound'] = df['q1'] - 1.5 * df['iqr']

# 筛选异常值
outliers = df[(df['price'] > df['upper_bound']) | (df['price'] < df['lower_bound'])]
# 可选:删除临时生成的辅助列
outliers = outliers.drop(['q1', 'q3', 'iqr', 'upper_bound', 'lower_bound'], axis=1)
print(outliers)

关键说明

两种方案的核心都是保证用于筛选的布尔Series和原df的索引完全对齐,避免手动修改索引导致的匹配错误。

内容的提问来源于stack exchange,提问作者John Smith

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 03:51:35