Edit : Выполняя это упражнение, я понял, что мне нужно извлекать слова целиком, а не части слов. Я отредактировал исходный вопрос и свой ответ, чтобы сделать код более надежным для этой конструкции, не меняя сути проблемы.
Мой Inte rnet и поиск SO не дали результата, поэтому я обращаюсь к вам.
У меня есть DataFrame, который выглядит так:
import pandas as pd
rows = [
('chocolate', 'choco'),
('banana', pd.np.nan),
('hello world', 'world'),
('hello you', 'world'),
('hello you choco', 'world'),
('this is a very long sentence', 'very long')
]
data = pd.DataFrame.from_records(rows, columns=['origin', 'to_find'])
origin to_find
0 chocolate choco
1 banana NaN
2 hello world world
3 hello you world
4 hello you choco world
5 this is a very long sentence very long
Моя цель - найти строку второго столбца в первом столбце и удалить ее. Если я не нахожу подстроку to_find
в origin
, я заменяю to_find
на NaN
. Поскольку это строковая операция, которую нужно выполнять построчно, я выбрал способ apply
. Это моя функция, которая работает почти *, как и ожидалось, и как я apply
это:
def find_word(row):
# Handle the case where to_find is already NaN
if row.to_find is pd.np.nan:
return row
if row.to_find in row.origin:
row.origin = row.origin.replace(row.to_find, '').strip()
else:
row.to_find = pd.np.nan
return row
new_df = data.apply(find_word, axis=1)
* этот код возвращает два пробела вместо одного между this is a
и sentence
, что нежелательно.
Ожидается, что new_df
будет выглядеть так:
origin to_find
0 late choco
1 banana NaN
2 hello world
3 hello you NaN
4 hello you choco NaN
5 this is a sentence very long
Моя проблема в том, что мой исходный df
имеет миллионы строк, и эта конкретная операция с огромным DataFrame занимает вечность. Есть ли у кого-нибудь более производительный, может быть, векторизованный способ решения этой проблемы?
(Метод .contains
, кажется, работает только для поиска одной конкретной c строки в векторе, а не попарно. Это было мое лучшее руководство но не смог заставить его работать.)