人 | 得分1 | 得分2 |
---|---|---|
爱丽丝 | 5.6 | 3.2 |
鲍勃 | 9.3 | 8.7 |
查理 | 7.2 | 不适用 |
戴夫 | -4 | 不适用 |
约翰 | 不适用 | 10 |
亨利 | 11 | 13 |
简 | 3 | 8 |
我有一张这样的桌子。大多数人有两个分数(Score1 和 Score2)。这些分数有不同的尺度。
我想使用他们在另一列中的分数来估算一列中缺失的 NA 值,以确定他们参加测试后的分数。例如,对于 Charlie,我想使用他的 Score1(7.2)并确定如果他参加了测试,他的 Score2 分数是多少。
我该怎么做?我假设开始时我需要使两列的比例相同。我不想使用 MinMaxScaler 来增加可变性。
我认为这有效:
feature = df[['Score1']]
feature2 = df[['Score2']]
scaler = StandardScaler().fit(feature.values)
df[['Score1']] = scaler.fit_transform(feature.values)
df[['Score2']] = scaler.fit_transform(feature2.values)
实现此目的的一种方法是使用回归模型,然后预测值。请注意,您需要首先将
nan
替换为平均值,然后缩放数据。如果不这样做,您将无法使用回归模型:
import pandas as pd
import numpy as np
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LinearRegression
data = {
'Person': ['Alice', 'Bob', 'Charlie', 'Dave', 'John', 'Henry', 'Jane'],
'Score1': [5.6, 9.3, 7.2, -4, np.nan, 11, 3],
'Score2': [3.2, 8.7, np.nan, np.nan, 10, 13, 8]
}
df = pd.DataFrame(data)
print(df)
df['Score1_filled'] = df['Score1'].fillna(df['Score1'].mean())
df['Score2_filled'] = df['Score2'].fillna(df['Score2'].mean())
scaler = StandardScaler()
df[['Score1_scaled', 'Score2_scaled']] = scaler.fit_transform(df[['Score1_filled', 'Score2_filled']])
train_data = df.dropna(subset=['Score1', 'Score2'])
model = LinearRegression()
model.fit(train_data[['Score1_scaled']], train_data['Score2_scaled'])
missing_score2 = df.loc[df['Score2'].isnull(), 'Score1_scaled']
predicted_score2_scaled = model.predict(missing_score2.values.reshape(-1, 1))
df.loc[df['Score2'].isnull(), 'Score2_scaled'] = predicted_score2_scaled
df[['Score1', 'Score2']] = scaler.inverse_transform(df[['Score1_scaled', 'Score2_scaled']])
print(df[['Person', 'Score1', 'Score2']])
返回:
Person Score1 Score2
0 Alice 5.60 3.200000
1 Bob 9.30 8.700000
2 Charlie 7.20 8.206991
3 Dave -4.00 0.139177
4 John 5.35 10.000000
5 Henry 11.00 13.000000
6 Jane 3.00 8.000000