Создать столбец имен в pandas dataframe

Я использую пакет Python names для генерации имен для тестирования QA.

Пакет names содержит функцию names.get_first_name(gender), которая позволяет использовать в качестве параметра строку male или female. В настоящее время у меня есть следующий DataFrame:

    Marital Gender
0   Single  Female
1   Married Male
2   Married Male
3   Single  Male
4   Married Female

Я пробовал следующее:

df.loc[df.Gender == 'Male', 'FirstName'] = names.get_first_name(gender = 'male')
df.loc[df.Gender == 'Female', 'FirstName'] = names.get_first_name(gender = 'female')

Но все, что я получаю взамен, - это всего лишь два имени:

    Marital Gender  FirstName
0   Single  Female  Kathleen
1   Married Male    David
2   Married Male    David
3   Single  Male    David
4   Married Female  Kathleen

Есть ли способ вызвать эту функцию отдельно для каждой строки, чтобы не все мужчины / женщины имели одно и то же точное имя?

1
0
241
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

вам нужен подать заявление

 df['Firstname']=df['Gender'].str.lower().apply(names.get_first_name)

Отлично, спасибо! Просто протестировал его, на самом деле нужно небольшое изменение, потому что метод, по-видимому, работает только со строчными буквами.

jadki 13.09.2018 19:26

Если скорость имеет значение с помощью map

list(map(names.get_first_name,df.Gender))
Out[51]: ['Harriett', 'Parker', 'Alfred', 'Debbie', 'Stanley']
#df['FN']=list(map(names.get_first_name,df.Gender))

Вы можете использовать понимание списка:

df['Firstname']= [names.get_first_name(gender) for gender in df['Gender'].str.lower()] 

И услышать - это хитрость, которая считывает все имена по полу (вместе с их вероятностями), а затем произвольно выбирает их.

import names

def get_names(gender):
    if not isinstance(gender, (str, unicode)) or gender.lower() not in ('male', 'female'):
        raise ValueError('Invalid gender')

    with open(names.FILES['first:{}'.format(gender.lower())], 'rb') as fin:
        first_names = []
        probs = []
        for line in fin:
            first_name, prob, dummy, dummy = line.strip().split()
            first_names.append(first_name)
            probs.append(float(prob) / 100)
    return pd.DataFrame({'first_name': first_names, 'probability': probs})

def get_random_first_names(n, first_names_by_gender):
    first_names = (
        first_names_by_gender
        .sample(n, replace=True, weights='probability')
        .loc[:, 'first_name']
        .tolist()
    )
    return first_names

first_names = {gender: get_names(gender) for gender in ('Male', 'Female')}

>>> get_random_first_names(3, first_names['Male'])
['RICHARD', 'EDWARD', 'HOMER']

>>> get_random_first_names(4, first_names['Female'])
['JANICE', 'CAROLINE', 'DOROTHY', 'DIANE']

Другие вопросы по теме