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

问题描述 投票:1回答:7

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

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

任何帮助表示赞赏

python regex pandas
7个回答
1
投票

试试吧

df.Name.str.replace(r'^(\s*(?:\S+\s+){1})\S+',r'\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])

0
投票

此代码将解决您的问题:

df['Name2'] = df.Name.str.replace('^(\w+)\s+(\w+)(|.+|)', r'\1\g<3>')

0
投票

你的正则表达式中的问题是你使用\b,它只匹配单词边界的位置,但不匹配空格。

如果你坚持正则表达式,你可以尝试这样的事情

^(\s*\w+\s+)\w+\s*(.*)$

\1\2取代

演示:https://regex101.com/r/hLlZTS/2/(我在演示中使用了space而不是\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组保持在上面。


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

-1
投票

避免正则表达式可能会更好;你可以使用str访问器。试试这个:

name_split = df['Name2'].str.split()

(name_split.str[0:1] + name_split.str[2:]).str.join(' ')

-1
投票

一种方法是使用apply()方法:

def del_middle(name):    
    name2 = name[0].split(' ')
    name2.pop(1)
    return name2

df.apply(del_middle, axis=1)
© www.soinside.com 2019 - 2024. All rights reserved.