#python #pandas #fillna
#python #панды #fillna
Вопрос:
Я создал небольшой словарь, где определенному названию присваивается средний возраст.
Age
Title
Master. 3.5
Miss. 21.0
Mr. 30.0
Mrs. 35.0
other 44.5
Теперь я хочу использовать этот словарь для заполнения недостающих значений в одном столбце фрейма данных на основе этого заголовка. Итак, для строк, в которых отсутствует «Возраст», а заголовок = «Master.», я хочу вставить значение 3.5 и так далее.
Я попробовал этот фрагмент кода, но он не работает; он не выдает ошибку, но также не заменяет отсутствующие значения. Что я делаю не так?
for title in piv.keys():
train[["Age"]][train["Title"]==title].fillna(piv[title], inplace=True)
где «piv» — это имя словаря, а «train» — это имя фрейма данных.
Кроме того, есть ли более элегантный способ сделать это?
PassengerId Survived Pclass Name Sex Age SibSp Parch Ticket Fare Cabin Embarked Title
0 1 0 3 Braund, Mr. Owen Harris male 22.0 1 0 A/5 21171 7.2500 NaN S Mr.
1 2 1 1 Cumings, Mrs. John Bradley (Florence Briggs Th... female 38.0 1 0 PC 17599 71.2833 C85 C Mrs.
{'Master.': 3.5, 'Miss.': 21.0, 'Mr.': 30.0, 'Mrs.': 35.0, 'other': 44.5}
Комментарии:
1. Можете ли вы предоставить образец фрейма данных и структуру словаря python?
2. Я попытался добавить пару строк, но здесь это выглядит немного неаккуратно. Не уверен, как я могу отформатировать его, чтобы он выглядел как фрейм данных
Ответ №1:
Один из вариантов:
train['Age'] = train.groupby('Title')['Age'].transform(lambda x: x.fillna(x.mean()))
Другой вариант:
pivdict = piv.set_index('Title').squeeze().to_dict()
train['Age'] = train['Age'].fillna(train['Title'].map(pivdict))
Ответ №2:
Один метод:
# create lookup dictionary
title = ['Master', 'Miss.', 'Mr.', 'Mrs.', 'other']
age = [3.5, 21, 30, 35, 44]
title_dict = dict(zip(title, age))
# mock dataframe
df = pd.DataFrame({'Name': ['Bob', 'Alice', 'Charles', 'Mary'],
'Age': [12, 27, None, None],
'Title': ['Master', 'Miss.', 'Mr.', 'other']})
# if age is Na then look it up in dictionary
df['Age'] = df['Age'].fillna(df['Title'].map(title_dict))
Ввод:
Name Age Title
0 Bob 12.0 Master
1 Alice 27.0 Miss.
2 Charles NaN Mr.
3 Mary NaN other
Вывод:
Name Age Title
0 Bob 12.0 Master
1 Alice 27.0 Miss.
2 Charles 30.0 Mr.
3 Mary 44.0 other