从字符串中删除第二个单词

时间:2019-02-28 01:23:11

标签: python regex pandas

今天,我正在处理由名称组成的系列。我需要在每一行中删除第二个名字。我的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','')

但是没有用。我不是正则表达式方面的专家,但这不应该那么困难,对吧?

感谢您的帮助

7 个答案:

答案 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)