Удалить комбинацию строк в наборе данных в Python

У меня есть набор данных на Python, где я хочу удалить определенные комбинации слов столбцаX в новом столбцеY.

Пример 2 строк столбцаX:

what is good: the weather what needs improvwement: the house
what is good: everything what needs improvement: nothing

Я хочу удалить следующую комбинацию слов: «что хорошо» и «что нужно улучшить».

В итоге в столбце Y должен остаться следующий текст:

погода дом все ничего

У меня есть следующий скрипт:

stoplist = {'what is good', 'what needs improvement'}
dataset['columnY']=dataset['columnX'].apply(lambda x: ''.join([item in x.split() if item nog in stoplist]))

Но это не работает. Что я здесь делаю неправильно?

Можете ли вы предоставить более подробную информацию о том, что «не работает»?

Scott Hunter 31.01.2023 15:06

слова остаются в тексте, а не удаляются.

marita 31.01.2023 15:07

Какова ценность nog?

Scott Hunter 31.01.2023 15:11

Если вы получаете ошибку, укажите ее в своем вопросе.

Tim 31.01.2023 15:19
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
4
55
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Может быть, вы можете работать с самими столбцами.

df["Y"] = df["X"]

df.Y = df.Y.str.replace("what is good", "")

Таким образом, вам придется сделать это для каждого элемента в вашем стоп-листе. Но я не знаю, сколько у вас предметов.

Так например

replacement_map = {"what needs improvement": "", "what is good": ""}

for old, new in replacement_map.items():
    df.Y = df.Y.str.replace(old, new)

если вам нужно указать разные переводы или

items_to_replace = ["what needs improvement", "what is good"]

for item_to_replace in items_to_replace:
    df.Y = df.Y.str.replace(item_to_replace, "")

если элемент всегда должен быть удален.

Или вы можете пропустить цикл, если вы выражаете его как регулярное выражение:

items_to_replace = ["what needs improvement", "what is good"]

replace_regex = r"|".join(item for item in items_to_replace)

df.Y = df.Y.str.replace(replace_regex , "")

(Кредиты: @MatBailie и @romanperekhrest)

Series.str.replace() — хорошая идея, но, поскольку она может принимать регулярные выражения, цикл не требуется. pandas.pydata.org/docs/reference/api/…
MatBailie 31.01.2023 15:33

Спасибо @MatBailie, добавил комментарий о регулярном выражении. Было бы большим улучшением, если бы элементы можно было упаковать в регулярное выражение.

Ken Jiiii 31.01.2023 15:46

Вы всегда можете выразить список строковых литералов в регулярном выражении, см. ответ от @romanperekhrest

MatBailie 31.01.2023 15:47

В вашем случае замена не произойдет, так как условие if item not in stoplistitem in x.split() if item not in stoplist) проверяет, соответствует ли отдельное слово какой-либо фразе из стоп-листа, что неверно. Вместо этого объедините свои стоп-фразы в шаблон регулярного выражения (для замены), как показано ниже:

df['columnY'] = df.columnX.replace(rf"({'|'.join(f'({i})' for i in stoplist)}): ", "", regex=True)

                                             columnX                columnY
0  what is good: the weather what needs improveme...  the weather the house
1  what is good: everything what needs improvemen...     everything nothing
Ответ принят как подходящий

другой способ без использования регулярного выражения и по-прежнему использовать apply - использовать простую функцию:

def func(s):
    for item in stoplist:
        s = s.replace(item, '')
    return s
df['columnY']=df['columnY'].apply(func)

Другие вопросы по теме