Как я могу заменить несколько строк одновременно в кадре данных Python? - PullRequest
0 голосов
/ 24 сентября 2019

У меня есть набор данных со следующими уникальными значениями в одном из его столбцов.

   df['Gender'].unique()

   array(['Female', 'M', 'Male', 'male', 'm', 'Male-ish', 'maile',
   'Trans-female', 'Cis Female', 'something kinda male?', 'Cis Male',
   'queer/she/they', 'non-binary', 'Make', 'Nah', 'All', 'Enby',
   'fluid', 'Genderqueer', 'Androgyne', 'Agender', 'Guy (-ish) ^_^',
   'male leaning androgynous', 'Male ', 'Man', 'msle', 'Neuter',
   'queer', 'A little about you', 'Malr',
   'ostensibly male, unsure what that really means')]

Как вы можете видеть, есть очевидные случаи, когда строка должна быть указана как 'Мужской' (яссылаясь на случаи, когда слово «мужчина» написано с ошибкой, конечно).Как я могу заменить эти значения на «Мужской», не вызывая функцию замены десять раз?Вот код, который я пробовал:

x=0
while x<=11:
for i in df['Gender']:
    if i[0:2]=='Ma':
        print('Male')
    elif i[0]=='m':
        print('Male')
x+=1

Однако я просто получаю отпечаток связки «Мужской».

Редактировать: Я хочу преобразовать следующие значения в «Мужской»':' M ',' male ',' m ',' maile ',' Make ',' Man ',' msle ',' Malr ',' Male '

Ответы [ 3 ]

3 голосов
/ 24 сентября 2019

Создайте список со всеми псевдонимами Male:

males_list = ['M', 'male', 'm', 'maile', 'Make', 'Man', 'msle', 'Malr', 'Male ']

, а затем замените их на:

df.loc[df['Gender'].isin(males_list), 'Gender'] = 'Male'

Кстати: всегда есть лучшее решение, чем зацикливание строк вpandas, не только в таких случаях.

1 голос
/ 24 сентября 2019

Если я вас правильно понимаю, вам нужен более обобщенный подход.Мы можем использовать регулярное выражение, чтобы проверить, начинается ли слово с M или имеет буквы Ma, перед которыми ставится пробел, поэтому мы не перехватываем Female:

  • (?i): означает игнорироватьчувствительность к регистру
  • ?<=\s: означает все слова, начинающиеся с ma и начинающиеся с пробела
df.loc[df['Gender'].str.contains('(?i)^M|(?<=\s)ma'), 'Gender'] = 'Male'

Выход

                Gender
0               Female
1                 Male
2                 Male
3                 Male
4                 Male
5                 Male
6                 Male
7         Trans-female
8           Cis Female
9                 Male
10                Male
11      queer/she/they
12          non-binary
13                Male
14                 Nah
15                 All
16                Enby
17               fluid
18         Genderqueer
19           Androgyne
20             Agender
21      Guy (-ish) ^_^
22                Male
23                Male
24                Male
25                Male
26              Neuter
27               queer
28  A little about you
29                Male
30                Male
1 голос
/ 24 сентября 2019

Я бы использовал функцию map, поскольку она позволяет вам создавать любую пользовательскую логику.Так, например, глядя на ваш код, что-то вроде этого поможет:

def correct_gender(text):

    if text[0:2]=='Ma' or text[0]=='m':
        return "Male"

    return text

df["Gender"] = df["Gender"].map(correct_gender)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...