#python #pandas #bigdata
Вопрос:
У меня есть набор продуктов, которым мне нужно присвоить коды таксономии Google. Всего существует примерно 213000 продуктов, к которым мне нужно добавить эти коды. Я ввел небольшую выборку из 7000 в pandas, чтобы посмотреть, смогу ли я написать что-нибудь для запуска ключевых слов и присвоить код столбцу, если ключевое слово найдено.
Я все еще разбираюсь в Питоне и Пандах в целом.
Я подумал, что если я напишу заявление if, объявляющее, что если оно соответствует ключевому слову, напишите код таксономии в столбец googlecode для каждой строки, содержащей ключевое слово, которое будет работать. Но я понятия не имею, как это написать. Я попробовал несколько вариантов и все время натыкаюсь на стену. Любой совет, с чего начать, был бы замечательным, даже рекомендации по учебнику о том, как сделать что-то подобное.
В настоящее время мой код выглядит следующим образом:
import pandas as pd
import numpy as np
product_data = pd.read_csv(
r'C:UsersmathewoDocumentsPythonGoogle sheet match.csv',
dtype={
'productcode': 'string',
'category': 'string'
}
)
product_data.dropna(inplace = True)
product_data["googlecode"] = ""
brake_code = [2977]
mirror_code = [2642]
generic_code = [5613]
lights_code = [3318]
suspension_code = [2935]
tyres_code = [911]
if product_data['category'].str.contains('BRAKE').any():
product_data['googlecode'].string.contains('BRAKE').any = brake_code
Текущая книга:
Ответ №1:
Попробуй:
conditions=['BRAKE','MIRROR','GENRIC','LIGHTS','SUSPENSION','TYRES']
labels=[2977,2642,5613,3318,2935,911]
Наконец, используйте str.extract()
и map()
:
pat='(' '|'.join(conditions) ')'
product_data['googlecode']=product_data['category'].str.extract(pat,expand=False)
product_data['googlecode']=product_data['googlecode'].map(dict(zip(conditions,labels)))
Комментарии:
1. @Erfan вы правы, сэр….. спасибо, сэр, за предложение 🙂
2. @Anurag Dabas вам нужно окружить свое
A|B|C
регулярное выражение круглыми скобками(A|B|C)
, иначе не будет никакой группы захвата. Кроме того, вы можете напрямую создать словарь и использовать его в своем соединении по мере использования ключей. Вот упрощенная версия:codes = {'BRAKE': 2977, 'MIRROR': 2642, 'GENRIC': 5613, 'LIGHTS': 3318, 'SUSPENSION': 2935, 'TYRES': 911} ; product_data['googlecode']=product_data['category'].str.extract('(%s)' %'|'.join(codes),expand=False).map(codes)
3. @mozway вы правы, сэр….. спасибо, сэр, за предложение..внес изменения в ответ 🙂
Ответ №2:
Представьте себе этот входной фрейм данных:
df = pd.DataFrame({'productcode': ['AA7690', 'AB0105', 'XYZ123', 'ZZ5103'],
'category': ['TRUCK amp; TAILER, AIR SYSTEM, ', 'TRUCK amp; TAILER, AIR SYSTEM, ', 'BLAHBLAH BRAKE BLAH', 'ACCESSORIES, BRANDED MERCHANDISE']
})
productcode category
0 AA7690 TRUCK amp; TAILER, AIR SYSTEM,
1 AB0105 TRUCK amp; TAILER, AIR SYSTEM,
2 XYZ123 BLAHBLAH BRAKE BLAH
3 ZZ5103 ACCESSORIES, BRANDED MERCHANDISE
Вы можете использовать эту пользовательскую функцию для поиска кодов продуктов и добавления их в качестве нового столбца
import re
codes = {'BRAKE': 2977, 'TRUCK': 1234, 'MIRROR': 2642}
regex_code = re.compile('|'.join(codes))
def search(s):
m = regex_code.search(s)
if m and m.group() in codes:
return codes[m.group()]
return 0
df['googlecode'] = df.category.apply(search)
выход:
productcode category googlecode
0 AA7690 TRUCK amp; TAILER, AIR SYSTEM, 1234
1 AB0105 TRUCK amp; TAILER, AIR SYSTEM, 1234
2 XYZ123 BLAHBLAH BRAKE BLAH 2977
3 ZZ5103 ACCESSORIES, BRANDED MERCHANDISE 0
если вы предпочитаете иметь NAN, а не 0, когда нет совпадения, удалите return 0
в функции