Python SimpleImputer使用两列计算平均值

Python SimpleImputer使用两列计算平均值,python,scikit-learn,Python,Scikit Learn,我正在使用SimpleImputer和most_Frequency来计算数据集中缺少的值。问题是这两列没有被独立处理,因此我在第一列中得到了最常见的值,用于替换第二列中的NaN,这显然会扭曲我的数据 代码如下 from sklearn.impute import SimpleImputer imputer = SimpleImputer(missing_values=np.nan, strategy='most_frequent',) imputer.fit(X[:, 2:4]) X[:, 2:

我正在使用SimpleImputer和most_Frequency来计算数据集中缺少的值。问题是这两列没有被独立处理,因此我在第一列中得到了最常见的值,用于替换第二列中的NaN,这显然会扭曲我的数据

代码如下

from sklearn.impute import SimpleImputer
imputer = SimpleImputer(missing_values=np.nan, strategy='most_frequent',)
imputer.fit(X[:, 2:4])
X[:, 2:4] = imputer.transform(X[:, 2:4])

print(X[:, 3])

[2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 1517.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0
 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 1517.0 2.0 2.0 2.0 2.0
 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0
 2.0 2.0 2.0 1517.0 2.0 1517.0 2.0 2.0 2.0 2.0 2.0 1517.0 2.0 2.0 2.0 2.0
 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0
 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0
 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0
 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0
 2426.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0
 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0
 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0
 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0
 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0
 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0
 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0
 2.0 2.0 2.0 2.0 2.0 2.0 1517.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0
 2.0 2.0 2.0 2.0]

我一直在尝试使用dict理解和
apply
的许多不同方法,但我似乎无法在一行代码中使用它。因此,我只能考虑使用for循环来迭代要使用
SimpleImputer
的列,并应用它:

X = pd.DataFrame({'A':[1,2,3,4,5,4,8],
                  'B':[2,2,2,2,2,2,np.nan],
                  'C':[6,5,np.nan,6,4,4,6],
                  'D':[1,2,3,np.nan,np.nan,3,4]})
cols = X.columns[2:]
imputer = SimpleImputer(missing_values=np.nan, strategy='most_frequent')
for i in cols:
  X[i] = imputer.fit_transform(X[i].values.reshape(-1,1))
它填充了第三列和第四列,但没有填充第二列(这就是为什么第二列中的
NaN
。此外,您可以看到,无论
2
是数据帧中最频繁的数字,各列都会被相应列中最频繁的数字填充:

   A    B    C    D
0  1  2.0  6.0  1.0
1  2  2.0  5.0  2.0
2  3  2.0  6.0  3.0
3  4  2.0  6.0  3.0
4  5  2.0  4.0  3.0
5  4  2.0  4.0  3.0
6  8  NaN  6.0  4.0

我会做进一步的调查,在不需要for循环的情况下尝试并应用此方法,并更新此答案。目前,这似乎可以完成此工作。

我一直在尝试使用dict理解和
应用的许多不同方法,但我似乎无法在一行代码中使用此方法。因此,我只能考虑使用要循环遍历要在其上使用
SimpleImputer
并应用它的列,请执行以下操作:

X = pd.DataFrame({'A':[1,2,3,4,5,4,8],
                  'B':[2,2,2,2,2,2,np.nan],
                  'C':[6,5,np.nan,6,4,4,6],
                  'D':[1,2,3,np.nan,np.nan,3,4]})
cols = X.columns[2:]
imputer = SimpleImputer(missing_values=np.nan, strategy='most_frequent')
for i in cols:
  X[i] = imputer.fit_transform(X[i].values.reshape(-1,1))
它填充了第三列和第四列,但没有填充第二列(这就是为什么第二列中的
NaN
。此外,您可以看到,无论
2
是数据帧中最频繁的数字,各列都会被相应列中最频繁的数字填充:

   A    B    C    D
0  1  2.0  6.0  1.0
1  2  2.0  5.0  2.0
2  3  2.0  6.0  3.0
3  4  2.0  6.0  3.0
4  5  2.0  4.0  3.0
5  4  2.0  4.0  3.0
6  8  NaN  6.0  4.0

我将做进一步的调查,尝试在不需要for循环的情况下应用它,并更新此答案。目前,这似乎可以完成任务。

所以您希望独立地拟合和变换每个列,对吗?是的,我认为SimpleImputer就是这么做的?如果通过完整矩阵(df),则不会。如果你想逐列处理,你需要循环,或者使用
。apply()
让我举一个简单的例子,这样我可以发布一个答案。所以你想独立地拟合和变换每一列,对吗?是的,我想这就是SimpleImputer所做的。如果你传递完整的矩阵(df),就不会了。如果你想逐列处理案例,你需要循环,或者使用
.apply()
让我举个简单的例子,这样我就可以发布答案了