Scikit-learn - 在特定列中填充缺失值

5

是否有可能为特定列填充值?

例如,如果我有3列:

  • A(分类):不包含任何缺失值
  • B(数字):不包含任何缺失值
  • C:假设此列包含数字数据并且其中一些数据缺失。我只想在此列中进行填充。

A,B 是整数、数值型还是分类变量? - smci
@smci:假设A是分类变量,B是数值变量。 - Glorian
@smci:抱歉回复晚了。我只想在 C 列中输入(单个输入)。 - Glorian
@VivekKumar:有没有更简单的解决方案,不需要应用学习模型来预测缺失值?在我看来,你提出的解决方案对于预处理步骤来说有点复杂。 - Glorian
现在您已经明确表示要进行单一插补(与其他列无关),您可以使用Imputer来选择多种技术(均值、众数、中位数)来填充缺失值。 - Vivek Kumar
显示剩余2条评论
3个回答

12
你可以使用 numpy.ravel
from sklearn.preprocessing import Imputer
imp = Imputer(missing_values=0, strategy="mean", axis=0)
df["C"] = imp.fit_transform(df[["C"]]).ravel()

1
Imputer仅执行单个插补(例如,从列C到列C)。听起来OP想要从A、B、C进行多重插补。 - smci
2
对于未来的观众,请使用SimpleImputer,因为Imputer类已被弃用。请查看https://github.com/scikit-learn/scikit-learn/blob/8d7e849428a4edd16c3e2a7dc8a088f108986a17/sklearn/preprocessing/imputation.py#L64 - Ali H. Kudeir

4

如果你有一个包含多列缺失数据的DataFrame,并且你想要根据其他列来填补特定的列,你可以先填补所有的数据,然后再取出你所需的特定列:

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),然后告诉填充器你的缺失数据是#

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)

-1

正如你所说,某些列没有缺失数据,这意味着当你使用任何的填补方法(如均值、KNN或其他)时,只会填补列 C 中的缺失值。 你只需将含有缺失数据的数据传递给任意一种填补方法,就能得到完整的无缺失数据。

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

或者使用kNN填充器

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

如果您想保留您的答案,那么您当前的答案可以列为评论,但建议您进行更详细的阐述并可能包含示例。 - Arar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接