Python SimpleImputer使用两列计算平均值
我正在使用SimpleImputer和most_Frequency来计算数据集中缺少的值。问题是这两列没有被独立处理,因此我在第一列中得到了最常见的值,用于替换第二列中的NaN,这显然会扭曲我的数据 代码如下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:
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()
让我举个简单的例子,这样我就可以发布答案了