Заменить имена списка в кадре данных - PullRequest
0 голосов
/ 26 октября 2018

Я пытаюсь заменить имена списка в кадре данных (столбец C):

Список имен (маленький пример, список слишком большой):

Jack
Liam
John
Ethan
George
...

Пример небольшого кадра данных:

       A          B                                   C
  French      house                Phone <phone_numbers>
 English      house                 email <adresse_mail>
  French  apartment                      my name is Liam
  French      house                         Hello George
 English  apartment   Ethan, my phone is <phone_numbers>

Мой сценарий:

import re
import pandas as pd
from pandas import Series

df = pd.read_excel('data_frame.xlsx')
data = Series.to_string(df['C'])

first_names = open('names_list.txt', 'r')
names_read = first_names.readlines()

def names(data):

    names_regex = re.compile(r'\b%s\b' % r'\b|\b'.join(map(re.escape, names_read)))
    replace_names = names_regex.sub('<name>', data)

    return replace_names

no_names = names(data)
print(no_names)

В качестве вывода у меня есть весь мой фрейм данных без каких-либо изменений ...

Я ожидал:

                                  C
              Phone <phone_numbers>
               email <adresse_mail>
                  my name is <name>
                       Hello <name>
<name>, my phone is <phone_numbers>

Ответы [ 2 ]

0 голосов
/ 26 октября 2018

Вы можете просто заменить их на циклическое прохождение значений данного столбца:

import pandas as pd

l = [
['French','house','Phone <phone_numbers>'],
['English','house','email <adresse_mail>'],
['French','apartment','my name is Liam'],
['French','house','Hello George'],
['English','apartment','Ethan, my phone is <phone_numbers>']
]

names = [
'Jack',
'Liam',
'John',
'Ethan',
'George'
]

df = pd.DataFrame(l, columns = list('ABC'))

for i in names:
  df.C = df.C.str.replace(i,'<name>')

print(df)
0 голосов
/ 26 октября 2018
name_list = ['Jack', 'Liam', 'John', 'Ethan']
mydf = pd.DataFrame({'C': ['Phone <phone_numbers>', 'email <adresse_mail>', 'my name is Liam', 'Hello George', 'Ethan, my phone is <phone_numbers>']})

Вы можете определить регулярное выражение на основе вашего списка имен. Затем вы сопоставляете эти значения со столбцом C и заменяете их на apply lambda

match = mydf.C.str.extractall('(' + '|'.join(name_list) + ')').reset_index().set_index('level_0').rename(columns={0: 'name'})
mydf = pd.concat([mydf, match], axis=1)
condition = mydf.match.notnull()
mydf.loc[condition, 'C'] = mydf[condition].apply(lambda x: x['C'].replace(x['name'], '<name>'), axis=1)

выход

                                     C  match    name
0                Phone <phone_numbers>    NaN     NaN
1                 email <adresse_mail>    NaN     NaN
2                    my name is <name>    0.0    Liam
3                         Hello <name>    0.0  George
4  <name>, my phone is <phone_numbers>    0.0   Ethan
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...