我想将 surname
、first_name
和 second_name
提取到我的 df 中的新列中。原始字符串 name
用逗号分隔姓氏和给定的名字。我正在努力处理第一个和第二个名称,因为有时逗号后面有空格。它应该是这样的:
name surname first_name second_name
0 Nancy Katherina, Dorsey Dorsey Nancy Katherina
1 Alan,Harper Harper Alan NaN
2 Charley Max, Sheen Sheen Charley Max
3 Audrey Maria,McKinsey McKinsey Audrey Maria
到目前为止我的方法(只能使 surname
工作):
df['surname'] = df['name'].str.extract(r'^(.+?),', expand=True)
预先感谢您的任何建议!
答案 0 :(得分:1)
使用 Series.str.split
by ,
并在其后可选空格并通过索引到新列来选择值:
s = df['name'].str.split(',\s*')
s1 = s.str[0].str.split()
df['surname'] = s.str[-1]
df['first_name'] = s1.str[0]
df['second_name'] = s1.str[1]
print (df)
name surname first_name second_name
0 Nancy Katherina, Dorsey Dorsey Nancy Katherina
1 Alan,Harper Harper Alan NaN
2 Charley Max, Sheen Sheen Charley Max
3 Audrey Maria,McKinsey McKinsey Audrey Maria
答案 1 :(得分:1)
这是正则表达式的常见用法。
我不熟悉您的 panda
环境,但此正则表达式可以满足您的需求:
^\s*(\w+)\s*(\w*)\s*,\s*(.*)\s*$
您可以使用正则表达式测试器进行测试(网上有很多),它可以正确处理逗号后没有第二个名称和空格的情况。
* 量词表示 zro 或更多,所以它会匹配,如果它存在,如果它不存在。括号提供分组以提取您想要的内容。
答案 2 :(得分:1)
正则表达式模式 '(\w+)\s*(\w+)?,\s*(\w+)'
会起作用:
df = pd.DataFrame([{'name': 'Nancy Katherina, Dorsey'},
{'name': 'Alan,Harper'},
{'name': 'Charley Max, Sheen'},
{'name': 'Audrey Maria,McKinsey'}])
df[['first_name', 'second_name', 'surname']] = df['name'].str.extract('(\w+)\s*(\w+)?,\s*(\w+)')
print(df[['name', 'surname', 'first_name', 'second_name']])
name surname first_name second_name
0 Nancy Katherina, Dorsey Dorsey Nancy Katherina
1 Alan,Harper Harper Alan NaN
2 Charley Max, Sheen Sheen Charley Max
3 Audrey Maria,McKinsey McKinsey Audrey Maria
答案 3 :(得分:1)
对于您显示的示例/尝试,请使用 df.str.extract
函数尝试以下代码。
df[["first_name", "second_name", "surname"]] = df['name'].str.extract('^(\S+)(?:\s+(\S+))?,\s*(.*)$', expand=False)
print(df[['name', 'surname', 'first_name', 'second_name']])
说明:为以上添加详细说明。
^(\S+) ##Matching everything before 1st space(s) occurrences in 1st capturing group.
(?:\s+(\S+))? ##In a non-capturing group matching spaces followed by non-spaces in 2nd capturing group, keeping this optional.
,\s* ##Matching comma followed by 0 or more spaces occurrences.
(.*)$ ##Creating 3rd capturing group which has everything till end of value.