【问题标题】:Scikit-learn - Impute values in a specific columnScikit-learn - 在特定列中估算值
【发布时间】:2018-09-23 03:52:07
【问题描述】:

是否可以估算特定列的值?

例如,如果我有 3 列:

  • A(分类):不包含任何缺失值
  • B(数字):不包含任何缺失值
  • C:假设此列包含数字数据,其中一些数据缺失。我只想在本专栏中进行估算。

【问题讨论】:

  • A,B 整数、数字、分类吗?
  • @smci:假设 A 是分类的,B 是数字的
  • 您是尝试从 A、B、C(多重插补)还是仅从 C(单一插补)进行插补?我认为您正在尝试做前者。
  • 首先您需要通过编码将分类数据转换为数值。然后可以使用回归模型来预测缺失值。
  • @smci:抱歉我的回复晚了。我只想在 C 列中进行估算(单次估算)

标签: pandas dataframe scikit-learn na imputation


【解决方案1】:

你可以使用numpy.ravel:

from sklearn.preprocessing import Imputer
imp = Imputer(missing_values=0, strategy="mean", axis=0)
df["C"] = imp.fit_transform(df[["C"]]).ravel()

【讨论】:

  • Imputer 仅进行单次插补(例如 C 列到 C 列)。听起来 OP 想要从 A、B、C 进行多重插补
  • 对于未来的观众,使用 SimpleImputer 因为 Imputer 类已被弃用。检查github.com/scikit-learn/scikit-learn/blob/…
【解决方案2】:

如果您的数据框在多列中缺少数据,并且您想根据其他列估算特定列,则可以估算所有内容并获取所需的特定列:

from sklearn.impute import KNNImputer
import pandas as pd

imputer = KNNImputer()
imputed_data = imputer.fit_transform(df)  # impute all the missing data
df_temp = pd.DataFrame(imputed_data)
df_temp.columns = df.columns
df['COL_TO_IMPUTE'] = df_temp['COL_TO_IMPUTE']  # update only the desired column

另一种方法是将所需列中的所有缺失数据转换为其他列中不包含的唯一字符,如果数据是字符串,则说#(如果数据是数字,则说max + 1) , 然后告诉 imputer 你丢失的数据是#:

from sklearn.impute import KNNImputer
import pandas as pd

cols_backup = df.columns
df['COL_TO_IMPUTE'].fillna('#', inplace=True)  # replace all missing data in desired column with with '#'
imputer = KNNImputer(missing_values='#')  # tell the imputer to consider only '#' as missing data
imputed_data = imputer.fit_transform(df)  # impute all '#'
df = pd.DataFrame(data=imputed_data, columns=cols_backup)

【讨论】:

    【解决方案3】:

    正如您所说,某些列没有缺失数据,这意味着当您使用任何插补方法(例如均值、KNN 或其他)时,只会在 C 列中插补缺失值。 只有您必须将丢失的数据传递给任何插补方法,然后您将获得完整的数据而不会丢失。

    imr = SimpleImputer(missing_values=np.NaN, strategy='mean')
    imr = imr.fit(with_missing)
    SimpleImputer()
    imputed_data = imr.transform(with_missing)
    

    或使用 kNN imputer

     imputer_KNN = KNNImputer(missing_values="NaN", n_neighbors=3, weights="uniform", metric="masked_euclidean")
    imputed_data = imputer_KNN.fit_transform(with_missing)
    

    【讨论】:

    • 你当前的答案可以作为评论列出,如果你想保留你的答案,那么你应该详细说明并可能包括一个例子。
    猜你喜欢
    • 2020-03-27
    • 2014-10-04
    • 2017-03-09
    • 2017-08-01
    • 2012-12-20
    • 1970-01-01
    • 2020-10-31
    • 2018-02-15
    相关资源
    最近更新 更多