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

构建房价预测模型时遇KeyError:指定特征不在索引中求助

问题

我正在基于如下代码构建房价预测模型:

import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error, r2_score
import category_encoders as ce

# Read the data
transactions_master_df = pd.read_csv('my_data.csv')

# Calculate the average house price for each district
avg_price_per_district = transactions_master_df.groupby('District')['Price'].mean().reset_index()
avg_price_per_district.rename(columns={'Price': 'AvgPrice'}, inplace=True)

#print the average price for each district with the district column next to it
print(avg_price_per_district)

# Merge the average price information with the original DataFrame
transactions_master_df = pd.merge(transactions_master_df, avg_price_per_district, on='District', how='left')

# Binary encode the 'District' feature
encoder = ce.BinaryEncoder(cols=['District'], base=6)
transactions_encoded = encoder.fit_transform(transactions_master_df)

# Concatenate additional features to the encoded DataFrame
additional_features = ['Building Age', 'Floor', 'Number of Floors', 'Elevator', 
                      'number of bathrooms', 'Otopark', 'steeped alley', 
                      'material used and luxuriness', 'view', 
                      'prestige of that district and its vicinity']

# Check if additional features are present in the transactions_encoded DataFrame
for feature in additional_features:
    if feature not in transactions_encoded.columns:
        print(f"Warning: {feature} column not found in transactions_encoded DataFrame.")

# Concatenate additional features to the encoded DataFrame
final_features = pd.concat([transactions_encoded[['District_0', 'District_1', 'District_2', 'SquareMeter']], 
                            transactions_encoded[additional_features]], axis=1)

# Ensure 'final_features' contains the necessary columns for training
print(final_features.head())

执行特征拼接步骤时,出现如下错误:

final_features = pd.concat([transactions_encoded[['District_0', 'District_1', 'District_2', 'SquareMeter']], 
---> 38                             transactions_encoded[additional_features]], axis=1)
KeyError: "['Building Age', 'Floor', 'Number of Floors'] not in index"

我确认这些特征存在于原始数据集中,但不清楚为何会触发该错误,恳请协助排查原因并解决。

排查与解决方案

核心原因

触发KeyError的本质是列名不匹配,常见场景包括:

  • 原始数据集的列名与additional_features列表中的名称存在大小写、空格或符号差异(比如原始列是Building_Age而非Building Age,或是floor全小写)
  • 合并或编码操作后,列名被意外修改(概率极低,优先排查拼写匹配问题)

验证步骤

先运行以下代码,打印所有实际列名,与additional_features逐一比对:

print("数据集所有列名:")
for col in transactions_encoded.columns:
    print(f"'{col}'")

通过输出可以直观看到列名的实际拼写、格式,快速定位不匹配的地方。

修复方案

方案1:修正列名匹配

根据验证结果,直接调整additional_features列表中的名称,确保与实际列名完全一致。比如原始列是Building_Age,就把列表里的'Building Age'改为'Building_Age'。

方案2:统一列名格式(推荐)

提前标准化列名,从根源避免格式差异问题:

# 在读取数据后,将列名统一为「小写+下划线替代空格」的格式
transactions_master_df.columns = transactions_master_df.columns.str.lower().str.replace(' ', '_')

# 同步更新additional_features列表为标准化后的名称
additional_features = ['building_age', 'floor', 'number_of_floors', 'elevator', 
                      'number_of_bathrooms', 'otopark', 'steeped_alley', 
                      'material_used_and_luxuriness', 'view', 
                      'prestige_of_that_district_and_its_vicinity']

方案3:简化特征选取逻辑

当前的pd.concat属于冗余操作,直接从编码后的数据集里选取目标列即可,减少出错概率:

# 合并需要的列名列表
selected_cols = ['District_0', 'District_1', 'District_2', 'SquareMeter'] + additional_features
# 直接选取列生成最终特征集
final_features = transactions_encoded[selected_cols]

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 06:42:48