Попытка применить функцию к Pandas DataFrame в Python - PullRequest
0 голосов
/ 17 июня 2020

Я пытаюсь применить эту функцию для заполнения столбца Age на основе столбцов Pclass и Sex. Но я не могу этого сделать. Как я могу заставить его работать?

def fill_age():
    Age = train['Age']
    Pclass = train['Pclass']
    Sex = train['Sex']

    if pd.isnull(Age):
        if Pclass == 1:
            return 34.61
        elif (Pclass == 1) and (Sex == 'male'):
            return 41.2813 
        elif (Pclass == 2) and (Sex == 'female'):
            return 28.72
        elif (Pclass == 2) and (Sex == 'male'):
            return 30.74
        elif (Pclass == 3) and (Sex == 'female'):
            return 21.75 
        elif (Pclass == 3) and (Sex == 'male'):
            return 26.51 
        else:
            pass
    else:
        return Age 


train['Age'] = train['Age'].apply(fill_age(),axis=1)

Я получаю следующую ошибку:

ValueError: истинное значение серии неоднозначно. Используйте a.empty, a.bool (), a.item (), a.any () или a.all ().

1 Ответ

1 голос
/ 17 июня 2020

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