Как заполнить пропущенные значения подобными медианными строками - PullRequest
0 голосов
/ 30 октября 2018

Как я могу заполнить пропущенные значения похожими строками 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 col равна 30. Так что заполните NaN 30.

Требуемый выход .

    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 голосов
/ 30 октября 2018

Используйте GroupBy.transform для возврата median с тем же размером Series как оригинал DataFrame, поэтому возможно использование fillna:

med = df.groupby(['SibSp', 'Parch', 'Pclass'])['Age'].transform('median')
df['Age'] = df['Age'].fillna(med)

Или аналогичное решение с лямбда-функцией:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...