Удалить второе слово из строки - PullRequest
0 голосов
/ 28 февраля 2019

Сегодня я работал с серией, состоящей из имен.Мне нужно стереть второе имя в каждом ряду.Мой 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 голосов
/ 28 февраля 2019

Проблема в вашем регулярном выражении заключается в том, что вы используете \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 выше.

0 голосов
/ 28 февраля 2019

Вы можете разделить пробелами 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
0 голосов
/ 28 февраля 2019

Один из способов сделать это - использовать метод apply():

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

df.apply(del_middle, axis=1)
0 голосов
/ 28 февраля 2019

Этот код решит вашу проблему:

df['Name2'] = df.Name.str.replace('^(\w+)\s+(\w+)(|.+|)', r'\1\g<3>')
0 голосов
/ 28 февраля 2019

Попробуйте с

df.Name.str.replace(r'^(\s*(?:\S+\s+){1})\S+',r'\1')
0 голосов
/ 28 февраля 2019

Попробуйте это:

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 голосов
/ 28 февраля 2019

Может быть, лучше избегать регулярных выражений;Вы можете использовать аксессор str.Попробуйте это:

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

(name_split.str[0:1] + name_split.str[2:]).str.join(' ')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...