#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. Чтобы подтвердить, что это не оставит никаких завершающих пробелов правильно? В остальном, по-моему, выглядит великолепно. Спасибо!