Подсчет значений на основе совпадения слов между двумя таблицами - PullRequest
0 голосов
/ 22 января 2020

У меня есть pandas фрейм данных, который имеет названия продуктов и связанные с ними значения, например:

+----------------+------------+-------+
|  product_name  | department | value |
+----------------+------------+-------+
| Golden Fish    | Food       |    31 |
| Red Fish       | Food       |    70 |
| Red Socks      | Clothing   |    20 |
| XXL Socks      | Clothing   |    26 |
| Yogurt         | Food       |     9 |
| Protein Yogurt | Food       |     5 |
+----------------+------------+-------+

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

Например, в этой новой таблице продуктов (не оригинальной) значения будут:

+--------------+----------------------+
| product_name | value (sum involved) |
+--------------+----------------------+
| Cod Fish     | 101 (70+31)          |
| XXL T-Shirt  | 26 (26)              |
| Yogurt       | 14 (9+5)             |
| Red Socks    | 116 (70+20+26)       |
+--------------+----------------------+

Я уже создал код, который работает, но он слишком архаичный c / медленный, и у него также есть некоторые проблемы.

Мой пример кода:

first_df = Первая таблица пример, second_df = пример второй таблицы (без значений)

def stringCleaning(product_string):
    if '(' in product_string:
        product_string = product_string.replace(r'(', r'\(')
    if ')' in product_string:
        product_string = product_string.replace(r')', r'\)')
    if '[' in product_string:
        product_string = product_string.replace(r'[', r'\[')
    if ']' in product_string:
        product_string = product_string.replace(r']', r'\]')
    return product_string

def countTokens(product_string, count = 0):
    for word in product_string.split(' '):
        if len(word) >= 3:
            count += first_df[first_df['product_name'].str.contains(r'[$ ]'+word+r'[$ ]', regex = True)]['value'].sum()
    return count

second_df['sum_by_tokens'] = second_df['product_name'].apply(lambda x: countTokens(stringCleaning(str(x))))

Строка "Красные носки" - это одна из тех ситуаций, когда у меня возникают проблемы. Потому что функция ищет «Socks», а затем «Red», и она продублирует значение строки «Red Socks» (20).

Также этот код очень медленный. У меня очень большой набор данных, и на его выполнение уйдут часы.

Я ищу лучшую альтернативу.

1 Ответ

0 голосов
/ 22 января 2020

Похоже, у вас есть категории . Если количество категорий невелико и вы знаете все категории, вы можете сделать столбец категории , а затем сгруппировать по категориям.

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