Python: заменить одно слово в предложении списком слов и поместить новые предложения в другой столбец в pandas - PullRequest
3 голосов
/ 19 июня 2020

У меня есть фрейм данных, в котором НЕКОТОРЫЕ предложения содержат слово 'o'clock', и я хочу заменить указанное перед ним время на список имеющихся у меня часов и поместить новые предложения в другой столбец, как показано ниже:

data= {"sentences":["I have a class at ten o'clock", "she is my friend", "she goes to school at eight o'clock"]}
my_list=['two', 'three','five','ten']

то, что я хотел бы видеть, - это дополнительный столбец с новыми предложениями, подобными приведенным ниже, в которых время изменено на все времена в списке:

Вывод:

     sentences                            new_sentences
0    I have a class at ten o'clock        I have a class at two o'clock, I have a class at three o'clock,...
1    she is my friend                     she is my friend
2    she goes to school at eight o'clock  she goes to school at two o'clock,....

повторение в столбце new_sentences нормально. Я пробовал использовать np.where:

np.where(data.str.contains('o\'clock', regex=False, case=False, na=False), data["sentence"].replace()... )

, но я не знаю, как заменить слово перед часами

Заранее благодарю

Ответы [ 2 ]

0 голосов
/ 19 июня 2020

Используйте:

# STEP 1
df1 = data['sentences'].str.extract(
    r"(?i)(?P<before>.*)\s(?P<clock>\w+(?=\so'clock))\s(?P<after>.*)")

# STEP 2
df1['clock'] = df1['clock'].str.replace(
    r'\w+', ','.join(my_list)).str.split(',')

# STEP 3
data['new_sentences'] = df1.dropna().explode('clock').agg(
    ' '.join, 1).groupby(level=0).agg(', '.join)

# STEP 4
data['new_sentences'] = data['new_sentences'].fillna(data['sentences'])

Объяснение / Шаги:

ШАГ 1: Используйте Series.str.extract вместе с заданным шаблоном регулярного выражения, чтобы создать трехколоночный фрейм данных, где первый столбец соответствует предложению перед часами e.g. 10, средний столбец соответствует самим часам, а правый столбец соответствует предложению после часов.

# df1
                  before  clock    after
0      I have a class at    ten  o'clock
1                    NaN    NaN      NaN
2  she goes to school at  eight  o'clock

ШАГ 2: Используйте Series.str.replace, чтобы заменить жетоны в столбце часов на все элементы в my_list. Затем используйте Series.str.split, чтобы разделить замененные токены вокруг разделителя ,.

# df1
                  before                    clock    after
0      I have a class at  [two, three, five, ten]  o'clock
1                    NaN                      NaN      NaN
2  she goes to school at  [two, three, five, ten]  o'clock

ШАГ 3: Dataframe.explode, чтобы развернуть фрейм данных df1 вокруг столбца clock .agg, чтобы соединить столбцы вдоль оси 1. Затем используйте groupby на уровне 0 для дальнейшего добавления этого кадра данных.

# data
                             sentences                                      new_sentences
0        I have a class at ten o'clock  I have a class at two o'clock, I have a class ...
1                     she is my friend                                                NaN
2  she goes to school at eight o'clock  she goes to school at two o'clock, she goes to...

ШАГ 4: Наконец, используйте Series.fillna, чтобы заполнить отсутствующие значения в столбце new_sentences из соответствующего столбца sentences.

# data
                             sentences                                      new_sentences
0        I have a class at ten o'clock  I have a class at two o'clock, I have a class ...
1                     she is my friend                                   she is my friend
2  she goes to school at eight o'clock  she goes to school at two o'clock, she goes to...
0 голосов
/ 19 июня 2020

Это соответствует вашим ожиданиям?

import re
data= {"sentences":["I have a class at ten o'clock", "she is my friend", "she goes to school at eight o'clock"]}
my_list=['two', 'three','five','ten']

regex = re.compile(r"(\w+) (?=o'clock)", re.IGNORECASE)
new = []

for i in data["sentences"]:
    for j in my_list:
        new.append(re.sub(regex, j + ' ', i))

new = list(set(new))

print(new)

Вывод:

I have a class at two o'clock
I have a class at ten o'clock
she goes to school at two o'clock
she goes to school at five o'clock
I have a class at five o'clock
I have a class at three o'clock
she goes to school at ten o'clock
she goes to school at three o'clock
she is my friend

ИЛИ эквивалент:

import re
data= {"sentences":["I have a class at ten o'clock", "she is my friend", "she goes to school at eight o'clock"]}
my_list=['two', 'three','five','ten']
regex = re.compile(r"(\w+) (?=o'clock)", re.IGNORECASE)
x = list(set([re.sub(regex, j + ' ', i) for j in my_list for i in data["sentences"]]))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...