如何用相似的行中位数填充缺失值

时间:2018-10-30 05:41:13

标签: python python-3.x pandas

如何为力大无比的数据集填充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或其他方法来执行此操作,但我无法弄清楚。有人可以帮忙吗?

谢谢。

1 个答案:

答案 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