我有一个数据集,其中的一列中具有以下唯一值。
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”,“男性'
答案 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