сравнить строки, если запись фрейма данных совпадает один раз, перейти к следующей строке
У меня есть такой фрейм данных:
df = pd.DataFrame({'item_descrip': ['ebc root beer single',
'yic yac big pack freshmint',
'froggy jumbo flakes',
'jumbo tart warmer',
'beer jerky'
]
})
У меня есть такой список:
brand_list = ['ebc', 'yic yac', 'beer', 'jumbo', 'tart', 'froggy']
Я хочу сопоставить строки в столбце brand_list
со строками item_descrip
и удалить совпадения в item_descrip
столбце. Я хочу создать еще один столбец unbranded
, содержащий очищенные строки из item_descrip
.
Моя проблема в том, что у меня очень большой размер, brand_list
и некоторые строки из этого списка совпадают несколько раз в item_descrip
столбце. Мой желаемый результат - если совпадение уже найдено для одной строки, пропустите эту строку.
Желаемый результат:
| | item_descrip | unbranded |
|---:|:-----------------------------------|:-----------------------------------|
| 0 | ebc root beer single | root beer single |
| 1 | yic yac big pack freshmint singles | big pack freshmint singles |
| 2 | froggy jumbo flakes | jumbo flakes |
| 3 | jumbo tart warmer | tart warmer |
| 4 | beer jerky | jerky |
Это код, который удаляет совпадения, но удаляет все совпадения в item_descrip
столбце. Например, у меня brand_list
есть ebc
и beer
в списке. Я хочу ebc
удалить только первую запись, а не beer
потому, что совпадение уже было найдено. Если совпадение обнаружено в первой части строки, не обрабатывайте эту запись дальше и переходите к следующей.
По сути, это похоже на то, что оператор if может войти в понимание списка, но я не уверен, как написать что-то, что говорит: если совпадение прошло, иначе продолжайте поиск.
df['unbranded'] = [' '.join([y for y in x.split() if not y.startswith(tuple(brand_list))]) for x in df['item_descrip']]
Я получил большую часть этого однострочного сообщения здесь: https://stackoverflow.com/questions/51666374/how-to-remove-strings-present-in-a-list-from-a-column-in-pandas
Ответы
ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ: я автор trrex
Если вам важна производительность, используйте trrex :
import pandas as pd
import trrex as tx
df = pd.DataFrame({'item_descrip': ['ebc root beer single',
'yic yac big pack freshmint',
'froggy jumbo flakes',
'jumbo tart warmer',
'beer jerky'
]
})
brand_list = ['ebc', 'yic yac', 'beer', 'jumbo', 'tart', 'froggy']
df['unbranded'] = df['item_descrip'].str.replace(tx.make(brand_list), '', n=1)
print(df)
Вывод
item_descrip unbranded
0 ebc root beer single root beer single
1 yic yac big pack freshmint big pack freshmint
2 froggy jumbo flakes jumbo flakes
3 jumbo tart warmer tart warmer
4 beer jerky jerky
Функция make построит регулярное выражение trie . Чтобы лучше понять, что происходит, make генерирует следующее регулярное выражение:
\b(?:froggy|tart|beer|yic yac|jumbo|ebc)\b
Аргумент n = 1 означает, что шаблон будет заменен только один раз, из документации :
n int, по умолчанию -1 (все)
Number of replacements to make from start.