Замените строку, если она соответствует каким-либо значениям условий в python

#python #pandas #string #dataframe #replace

Вопрос:

У меня есть фрейм данных pandas, и я хотел бы удалить вложенную строку во всех значениях, если она соответствует условию, что строка = «тест», «тесты», «тестирование», «ориг» и «новый». Я могу использовать str.replace() для замены значения для одного строкового условия, но не уверен, как включить дополнительные условия для проверки и замены.

Смотреть ниже:

 df_1 = pd.DataFrame({'id': ['001', '002', '003', '004', '005', '006', '007', '008'],
                     'color_value': ['blue_test', 'red', 'yellow_tests', 'orange_orig',
                     'blue_new','red', 'blue_testing', 'orange']})

 

При одном условии я могу сделать:

 term = 'test'
df_1['color_value'] = df_1['color_value'].str.replace(term,'')
 

Как я могу расширить его, чтобы включить удаление «тестов», «тестирования», «орига» и «нового»?

Комментарии:

1. У меня также есть такие суффиксы, как «ориг» и «новый», а также «тест», «тесты» и «тестирование», которые необходимо удалить.

Ответ №1:

Используйте регулярное выражение:

 term = 'test(s|ing)?'
df_1['color_value'] = df_1['color_value'].str.replace(term, '', regex=True)
print(df_1)
 

Выход

     id color_value
0  001       blue_
1  002         red
2  003     yellow_
3  004      orange
4  005        blue
5  006         red
6  007       blue_
7  008      orange
 

Из документации по ул. заменить:

pat str или скомпилированная
строка регулярного выражения может быть последовательностью символов или регулярным выражением.

Обновить

Для включения "new", "origin" вы могли бы использовать другое регулярное выражение:

 term = 'test(s|ing)?|new|orig'
df_1['color_value'] = df_1['color_value'].str.replace(term, '', regex=True)
print(df_1)
 

Выход

     id color_value
0  001       blue_
1  002         red
2  003     yellow_
3  004     orange_
4  005       blue_
5  006         red
6  007       blue_
7  008      orange
 

Общее Решение

Если у вас много слов, я предлагаю вам использовать библиотеку, такую как trrex, она построит регулярное выражение из набора слов:

 import pandas as pd
import trrex as tx

df_1 = pd.DataFrame({'id': ['001', '002', '003', '004', '005', '006', '007', '008'],
                     'color_value': ['blue_test', 'red', 'yellow_tests', 'orange_orig',
                                     'blue_new', 'red', 'blue_testing', 'orange']})

term = tx.make(['test', 'tests', 'testing', 'orig', 'new'], prefix="", suffix="")
df_1['color_value'] = df_1['color_value'].str.replace(term, '', regex=True)
print(df_1)
 

Выход

     id color_value
0  001       blue_
1  002         red
2  003     yellow_
3  004     orange_
4  005       blue_
5  006         red
6  007       blue_
7  008      orange
 

Шаблон для данного примера таков:

 term = tx.make(['test', 'tests', 'testing', 'orig', 'new'], prefix="", suffix="")
print(term)
 

Вывод (построение шаблона с помощью trrex)

 (?:test(?:ing|s)?|new|orig)
 

Отказ от ответственности

Я автор trrex

Комментарии:

1. Что делать, если в других строках нет теста на базовое слово? У меня также есть такие суффиксы, как «ориг» и «новый», а также «тест», «тесты» и «тестирование», которые необходимо удалить.

2. Включите в вопрос лучший пример и ожидаемый результат

3. Я обновил вопрос.

4. @ASsoccer9 Обновил ответ.

5. Чтобы подтвердить, что это не оставит никаких завершающих пробелов правильно? В остальном, по-моему, выглядит великолепно. Спасибо!