【问题标题】:sklearn impute rows satisfying conditionsklearn 估算行满足条件
【发布时间】:2020-09-30 12:09:57
【问题描述】:

我正在尝试使用 sklearn SimpleImputer 从包含泰坦尼克号数据的 pandas DataFrame 中的特定列中估算缺失的年龄。但是,我想单独使用其他主人年龄的平均值来估算姓名中包含“主人”一词的乘客的缺失值。

我尝试找到该数据,并单独处理:

imputer = SimpleImputer(strategy="mean")

# Copy data
imputed_X = X.copy()

# Get data for "masters"
masters = imputed_X[imputed_X['Name'].str.contains("Master")]

# Get imputed version of Age column
masters_age_imputed = pd.DataFrame(imputer.fit_transform(masters[["Age"]]))
masters_age_imputed.index = masters.index
# (So far so good... the missing values have been replaced with the average)

# But putting those values back into the DataFrame doesn't work:
imputed_X.loc[X['Name'].str.contains("Master"),"Age"] = masters_age_imputed

这不是用平均年龄来计算所有缺失的 Master 的年龄,而是删除所有非缺失的年龄,并用 NaN 替换它们。

有没有更好的方法来做到这一点?例如,一个有效的?除了设置我自己的 for 循环并手动替换所有内容之外?

【问题讨论】:

  • 你能发布一个示例数据吗?如果您只想替换姓名中包含Masters 的人的年龄,请尝试类似imputed_X[imputed_X['Name'].str.contains("Master")]['Age'].fillna(imputed_X[imputed_X['Name'].str.contains("Master")]['Age'].mean())

标签: python pandas scikit-learn imputation


【解决方案1】:

您需要先适应并使用它来转换数据。当您适合 imputer 时,您可以使用该列以及缺失值。使用该拟合模型使用下面使用的变换来估算缺失值。

你可以试试这个吗?

imp = Imputer(missing_values='NaN', strategy='mean', axis=0)
imp = imp.fit(imputed_X[['Age']])
imputed_X['Age'] = imp.transform(imputed_X[['Age']]).ravel()

如果您只想估算数据的一个子集,(column name contains master for eg),那么您可以这样做,然后 merge 将其返回到原始数据帧。你不需要循环,你可以pd.merge它回来。

【讨论】:

猜你喜欢
  • 2020-08-29
  • 2015-03-21
  • 2014-06-19
  • 2021-02-05
  • 2013-10-14
  • 1970-01-01
  • 1970-01-01
  • 2019-04-01
  • 1970-01-01
相关资源
最近更新 更多