如何用简单线性回归模型填充泰坦尼克号数据集的缺失年龄值?
用线性回归预测值填充泰坦尼克号数据集的缺失年龄
咱们先拆解你遇到的两个问题的根源,再一步步给出修正方案:
问题1:DataFrame无法直接作为fillna的value参数
你用pd.DataFrame(linreg.predict(test_data))生成的age是一个DataFrame,但fillna的value参数只接受标量、字典或Series类型,直接传入DataFrame自然会触发类型错误。解决这个问题的核心是把预测结果转换成与原数据索引匹配的Series。
问题2:apply方法缺少必要的函数参数
第二个错误是因为你调用apply()时没有传入要执行的具体函数,这种写法本身就不符合apply的使用逻辑——咱们根本不需要用apply来做填充操作,直接用预测值Series匹配缺失位置即可。
修正后的完整代码
import pandas as pd from sklearn.linear_model import LinearRegression # 初始化线性回归模型 linreg = LinearRegression() # 读取数据集(Windows路径建议用原始字符串避免转义问题) data = pd.read_csv(r'C:\Users\ryans\seaborn-data\titanic.csv') # 选择用于预测年龄的特征与目标列 data_with_null = data[['survived','pclass','sibsp','parch','fare','age']] # 筛选无缺失值的样本作为训练集 data_without_null = data_with_null.dropna() # 拆分训练集的特征与目标变量 train_data_x = data_without_null.iloc[:,:5] train_data_y = data_without_null.iloc[:,5] # 拟合线性回归模型 linreg.fit(train_data_x, train_data_y) # 生成与原数据索引匹配的预测年龄Series(关键修正) predicted_age = pd.Series( linreg.predict(data_with_null.iloc[:,:5]), index=data_with_null.index ) # 用预测值填充age列的缺失值 data_with_null['age'] = data_with_null['age'].fillna(predicted_age) # 验证空值是否已填充完成 print(data_with_null.apply(lambda x: sum(x.isnull()), axis=0))
关键细节说明
- 路径处理:Windows系统下的文件路径建议加
r使用原始字符串,避免斜杠转义带来的读取错误。 - 索引匹配:将预测结果转为Series并指定与原数据一致的索引,能确保填充时预测值和对应行精准匹配,不会出现错位。
- 填充逻辑:
fillna(predicted_age)会自动识别age列的缺失位置,仅用对应索引的预测值填充,无需手动筛选缺失行。
这样修改后,就能顺利用线性回归的预测结果完成缺失年龄的插补了。
内容的提问来源于stack exchange,提问作者ASH
相关产品推荐
相关产品推荐

