Fillna() в столбце на основе условия

#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