我有两个数据帧
df1
name
ADAM, HAFIZ M
ABAD, FARLEY J
CORDDED, NANCY C
BOMBSHAD, WANG D
df2
JOSEPH W. HOLUBKA
WANG E. JONATHAN
CUCU F. LIU,
WANG C. DANA,
LANDY F. JON
我希望提取每个数据帧的名字。对于df1;名字";"之后的部分"&",第二个df,第一个名字就是我想要的。
所以返回的df是
df1
HAFIZ
FARLEY
NANCY
WANG
df2
JOSEPH
WANG
CUCU
WANG
LANDY
我当前的代码是
df['name'].str.upper().apply(lambda name:re.search(r'w+(?!.*,)',name).group())
这个regex适用于这两个df,但是,我刚刚意识到我的数据有一个输入错误。在df2中,刘和Dana有一个"最后导致regex不起作用。
错误是group((不是属性。
我有办法修复这个代码吗?regex应该同时适用于df
您可以使用
(^(?=[^,]*,?$)[w'-]+|(?<=, )[w'-]+)
请参阅regex演示。如果字符串中有尾随逗号,则此模式允许在字符串的初始位置匹配名称。
在Pandas中使用Series.str.extract
矢量化方法:
df['first name'] = df['name'].str.upper().str.extract(r"(^(?=[^,]*,?$)[w'-]+|(?<=, )[w'-]+)", expand=False)
Regex详细信息
^(?=[^,]*,?$)[w'-]+
-字符串(^
(开头的一个或多个单词、'
和-
字符([w'-]+
((如果字符串没有逗号,但可以以可选逗号((?=[^,]*,?$)
(结尾(|
-或(?<=, )[w'-]+
-一个或多个单词,'
和-
字符,前面加逗号+空格
编辑:再次尝试,因为我的第一个不完整。您可以从这个极好的答案中获取正则表达式,只需要更改一件事。如果他们的前瞻性匹配任何逗号,我们只想匹配后面跟着另一个单词的逗号。结果:
(?:(?<=^(?!.*, *w))|(?<=, ))([A-Z]+)