Pandas - сопоставить столбец строки со столбцом регулярных выражений - PullRequest
1 голос
/ 29 апреля 2020

Проблема: у меня есть два фрейма данных - один с набором ненормализованных названий продуктов, а другой с набором регулярных выражений, привязанных к нормализованным названиям продуктов. Мне нужно сопоставить ненормализованные заголовки с некоторыми регулярными выражениями, которые связаны с нормализованными заголовками. Это должно иметь больше смысла с примерами данных ниже.

Первый кадр данных (raw_titles):

|   | Title                                          | Release Date |
|---|------------------------------------------------|--------------|
| 1 | Apple iPad Air (3rd generation) - 64GB         | 01/01/20     |
| 2 | Philips Hue White Ambiance A19 LED Smart Bulbs | 08/12/20     |
| 3 | Powerbeats Pro Totally Wireless Earphones      | 06/20/19     |

Второй кадр данных (regex_titles):

|   | Regex                                                 | Manufacturer | Model                   |
|---|-------------------------------------------------------|--------------|-------------------------|
| 1 | /ipad\s?air(?=.*(\b3\b|3rd\s?gen|2019))|\bair\s?3\b/i | Apple        | iPad Air (2019)         |
| 2 | /hue(?=.*cher)/i                                      | Philips      | Hue White Ambiance Cher |
| 3 | /powerbeats\s?pro/i                                   | Beats        | Powerbeats Pro          |

Идея состоит в том, взять каждый заголовок в raw_titles и пропустить его через все значения в regex_titles, чтобы увидеть, есть ли совпадение. Как только это будет сделано, в raw_titles должны появиться два дополнительных столбца: «Производитель» и «Модель», которые соответствуют серии regex_titles, с которой они сопоставляются (если не было совпадений, она просто оставалась бы пустой.

Тогда итоговая таблица будет выглядеть как это:

|   | Title                                          | Release Date | Manufacturer | Model           |
|---|------------------------------------------------|--------------|--------------|-----------------|
| 1 | Apple iPad Air (3rd generation) - 64GB         | 01/01/20     | Apple        | iPad Air (2019) |
| 2 | Philips Hue White Ambiance A19 LED Smart Bulbs | 08/12/20     |              |                 |
| 3 | Powerbeats Pro Totally Wireless Earphones      | 06/12/19     | Beats        | Powerbeats Pro  |

1 Ответ

0 голосов
/ 29 апреля 2020

Есть много способов сделать это, но самый простой - протестировать каждое из регулярных выражений для каждого из названий и вернуть первое найденное совпадение. Сначала мы определим функцию, которая будет возвращать два значения: производителя и модель строки регулярного выражения, если мы сопоставим, два None с в противном случае:

def find_match(title_row):
    for _, regex_row in regex_titles.iterrows():
        if re.search(regex_row['Regex'], title_row['Title']):
            return [regex_row['Manufacturer'], regex_row['Model']]
    return  [None, None]

Затем мы применим нашу функцию к нашему заголовку с данными и сохраните вывод в двух новых столбцах, Производитель и Модель:

raw_titles[['Manufacturer', 'Model']] = raw_titles.apply(find_match, axis=1, result_type='broadcast')

                                            Title Release Date Manufacturer            Model
0          Apple iPad Air (3rd generation) - 64GB     01/01/20        Apple  iPad Air (2019)
1  Philips Hue White Ambiance A19 LED Smart Bulbs     08/12/20         None             None
2       Powerbeats Pro Totally Wireless Earphones     06/20/19        Beats   Powerbeats Pro

Одна сложность состоит в том, что вам придется преобразовать ваши perl регулярные выражения в python регулярное выражение:

perl: /powerbeats\s?pro/i -> python: (?i)powerbeats\s?pro

Они в основном одинаковые, с небольшими отличиями. Вот ссылка.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...