У меня есть 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).
Также этот код очень медленный. У меня очень большой набор данных, и на его выполнение уйдут часы.
Я ищу лучшую альтернативу.