构建房价预测模型时遇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
相关产品推荐
相关产品推荐

