Используйте:
# 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...