сравнить строки, если запись фрейма данных совпадает один раз, перейти к следующей строке

Dec 04 2020

У меня есть такой фрейм данных:

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

Ответы

1 DaniMesejo Dec 04 2020 at 23:10

ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ: я автор 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.