Вам следует рассмотреть возможность использования скобок для разделения аргументов (что вы уже сделали) и изменить логический оператор and
на побитовый оператор &
, чтобы избежать этого типа ошибок. Также имейте в виду, что если вы хотите использовать apply
, тогда вам следует использовать параметр x
для функции, которая будет частью лямбда в функции apply
:
def fill_age(x):
Age = x['Age']
Pclass = x['Pclass']
Sex = x['Sex']
if pd.isnull(Age):
if Pclass == 1:
return 34.61
elif (Pclass == 1) & (Sex == 'male'):
return 41.2813
elif (Pclass == 2) & (Sex == 'female'):
return 28.72
elif (Pclass == 2) & (Sex == 'male'):
return 30.74
elif (Pclass == 3) & (Sex == 'female'):
return 21.75
elif (Pclass == 3) & (Sex == 'male'):
return 26.51
else:
pass
else:
return Age
Теперь, используя apply с лямбда:
train['Age'] = train['Age'].apply(lambda x: fill_age(x),axis=1)
В образце кадра данных:
df = pd.DataFrame({'Age':[1,np.nan,3,np.nan,5,6],
'Pclass':[1,2,3,3,2,1],
'Sex':['male','female','male','female','male','female']})
Используя ответ, приведенный выше:
df['Age'] = df.apply(lambda x: fill_age(x),axis=1)
Вывод:
Age Pclass Sex
0 1.00 1 male
1 28.72 2 female
2 3.00 3 male
3 21.75 3 female
4 5.00 2 male
5 6.00 1 female