如何在Python数据框中同时替换多行?

时间:2019-09-24 11:34:20

标签: python pandas dataframe

我有一个数据集,其中的一列中具有以下唯一值。

   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')]

如您所见,在某些情况下,应将行列为“男性”(当然,我指的是“男性”拼写错误的情况)。如何在不调用replace函数十次的情况下用“ Male”替换这些值?这是我尝试过的代码:

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”,“男”,“ m”,“ maile”,“ Make”,“ Man”,“ msle”,“ Malr”,“男性'

3 个答案:

答案 0 :(得分:3)

创建一个列表,列出所有男性的昵称:

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

然后将它们替换为:

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

btw:总是有比循环pandas中的行更好的解决方案,不仅仅是在这种情况下。

答案 1 :(得分:1)

我将使用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)

答案 2 :(得分:1)

如果我对您的理解正确,那么您需要一种更通用的方法。我们可以使用正则表达式来检查单词是否以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