如何为力大无比的数据集填充median
行中相似的缺失值?
我有一个Age
列,其中有80个缺失值,我想通过取其他列的相似行的中位数来填充那些缺失值。 ['SibSp', 'Parch', 'Pclass']
假设例如:
Age SibSp Parch Pclass
0 28 2 1 2
1 NaN 2 1 2
2 30 3 3 1
3 40 4 3 3
4 30 2 1 2
5 40 2 1 2
现在,我想通过考虑其他三列中的相似值来填充NaN
列中的Age
。在这种情况下,我有三行,第1行是示例值。
Age SibSp Parch Pclass
0 28 2 1 2
4 30 2 1 2
5 40 2 1 2
此处Age
列的中位数是30。因此用30填充NaN。
必需的输出。
Age SibSp Parch Pclass
0 28 2 1 2
1 30 2 1 2 # Fill with median of those above three rows.
2 30 3 3 1
3 40 4 3 3
4 30 2 1 2
5 40 2 1 2
这是我写的,但是没有用。
# Filling missing values Of Age.
for i in combined.Age[combined.Age.isna()].index.tolist():
age_med = combined.Age.median()
mask1 = combined.SibSp.eq(combined.iloc[i].SibSp)
mask2 = combined.Parch.eq(combined.iloc[i].Parch)
mask3 = combined.Pclass.eq(combined.iloc[i].Pclass)
age_pred = combined.Age[mask1 & mask2 & mask3].median()
combined.iloc[i]['Age'] = age_pred
我敢肯定,有更好的方法可以使用groupby
或其他方法来执行此操作,但我无法弄清楚。有人可以帮忙吗?
谢谢。
答案 0 :(得分:4)
使用GroupBy.transform
来返回median
,其尺寸与原始Series
相同,DataFrame
,因此可以使用fillna
:
med = df.groupby(['SibSp', 'Parch', 'Pclass'])['Age'].transform('median')
df['Age'] = df['Age'].fillna(med)
或具有lambda函数的类似解决方案:
df['Age'] = (df.groupby(['SibSp', 'Parch', 'Pclass'])['Age']
.transform(lambda x: x.fillna(x.median())))
print (df)
Age SibSp Parch Pclass
0 28.0 2 1 2
1 30.0 2 1 2
2 30.0 3 3 1
3 40.0 4 3 3
4 30.0 2 1 2
5 40.0 2 1 2