今天,我正在处理由名称组成的系列。我需要在每一行中删除第二个名字。我的DataFrame看起来像这样:
Name
John Charles Bloom
Michael Jackson
Peter Rodrigo Aguilera Wayne
我想要的输出是这样:
Name
John Bloom
Michael
Peter Aguilera Wayne
所以我尝试了一些类似的事情:
df['Name2']=df.Name.str.replace('\b\w*\b(\b\w*\b)\b\w*\b','')
但是没有用。我不是正则表达式方面的专家,但这不应该那么困难,对吧?
感谢您的帮助
答案 0 :(得分:1)
尝试
df.Name.str.replace(r'^(\s*(?:\S+\s+){1})\S+',r'\1')
答案 1 :(得分:0)
尝试一下:
string1 = 'John Charles Bloom'
l = string1.split()
(' ').join([l[x] for x in [0].extend(list(range(2,len(l))))])
one = [0]
one.extend(list(range(2,len(l))))
(' ').join([l[x] for x in one])
答案 2 :(得分:0)
此代码将解决您的问题:
df['Name2'] = df.Name.str.replace('^(\w+)\s+(\w+)(|.+|)', r'\1\g<3>')
答案 3 :(得分:0)
正则表达式中的问题是您使用\b
,它仅与单词边界的位置匹配,而与空格匹配。
如果您坚持使用正则表达式,则可以尝试这样的操作
^(\s*\w+\s+)\w+\s*(.*)$
替换为\1\2
演示:https://regex101.com/r/hLlZTS/2/
(我在演示中使用空格代替了\s
,只是为了解决regex101.com中的换行符)
说明:
^ start of line
( ) group 1:
\s*\w+\s+ some optional spaces,
followed by word characters,
followed by spaces
\w+\s* some word characters, followed by optional spaces
(i.e. the second word and the spaces following it)
(.*) group 2: everything else
$ till end of line
您只需将第1组和第2组保留在上面。
答案 4 :(得分:0)
如果结果列表中至少有两个项目,则可以用1+个空格分隔,然后省略第二个项目,然后用空格将字符串连起来:
df['Name2']=df['Name'].str.split(r'\s+').apply(lambda x: x[0:1] + x[2:] if len(x) > 2 else x).str.join(' ')
测试演示:
import pandas as pd
df = pd.DataFrame({'Name': ['John Charles Bloom','Michael Jackson','Peter Rodrigo Aguilera Wayne', 'Single', 'First Last']})
df['Name2']=df['Name'].str.split(r'\s+').apply(lambda x: x[0:1] + x[2:] if len(x) > 2 else x).str.join(' ')
print(df)
输出:
Name Name2
0 John Charles Bloom John Bloom
1 Michael Jackson Michael Jackson
2 Peter Rodrigo Aguilera Wayne Peter Aguilera Wayne
3 Single Single
4 First Last First Last
答案 5 :(得分:-1)
最好避免使用正则表达式;您可以使用str
访问器。试试这个:
name_split = df['Name2'].str.split()
(name_split.str[0:1] + name_split.str[2:]).str.join(' ')
答案 6 :(得分:-1)
一种实现方法是使用apply()
方法:
def del_middle(name):
name2 = name[0].split(' ')
name2.pop(1)
return name2
df.apply(del_middle, axis=1)