根据具有不同比例的另一列推算一列中的 NA 值

问题描述 投票:0回答:1
得分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)
python pandas
1个回答
0
投票

实现此目的的一种方法是使用回归模型,然后预测值。请注意,您需要首先将

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
© www.soinside.com 2019 - 2024. All rights reserved.