Как присвоить столбцу заданное значение, если выполнено условие?

#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 в функции