Не использовать apply(axis=1)
.Вместо этого вы должны установить значения для подмножества, используя .loc
.Это простое отображение для верхнего случая.
m = train.Age.isnull()
d = {1: 38, 2: 30, 3: 25}
train.loc[m, 'Age'] = train.loc[m, 'Pclass'].map(d)
Для нижнего регистра из-за предложения else
мы можем использовать np.select
.Это работает так: мы создаем список условий, который следует порядку логики if, elif else.Затем мы предоставляем список выбора для выбора, когда мы сталкиваемся с первым True
.Поскольку у вас есть вложенная логика, нам нужно сначала развернуть ее так, чтобы она логически читалась как
if age is null and pclass == 1
elif age is null and pclass == 2
elif age is null
else
Пример данных
import pandas as pd
import numpy as np
df = pd.DataFrame({'Age': [50, 60, 70, np.NaN, np.NaN, np.NaN, np.NaN],
'Pclass': [1, 1, 1, 1, 2, np.NaN, 1]})
# Age Pclass
#0 50.0 1.0
#1 60.0 1.0
#2 70.0 1.0
#3 NaN 1.0
#4 NaN 2.0
#5 NaN NaN
#6 NaN 1.0
m = df.Age.isnull()
conds = [m & df.Pclass.eq(1),
m & df.Pclass.eq(2),
m]
choices = [37, 29, 24]
df['Age'] = np.select(conds, choices, default=df.Age)
# |
# Takes care of else, i.e. Age not null
print(df)
# Age Pclass
#0 50.0 1.0
#1 60.0 1.0
#2 70.0 1.0
#3 37.0 1.0
#4 29.0 2.0
#5 24.0 NaN
#6 37.0 1.0