Как получить результаты частичного совпадения в SQL / Pandas / Python и заполнить столбец условным значением? - PullRequest
0 голосов
/ 17 июня 2020

Я ищу значения, которые частично совпадают в одном столбце, и заменяю столбец «подкатегория» значением, полученным из столбца «имя элемента». Столбец «Подкатегория» в настоящее время дублирует столбец «Название элемента».

Например, на изображении ниже я хотел бы заменить текущие значения в столбце «подкатегория» категорией пива (IPA, Ale, Pale Ale, Lager, Pilsner, et c. ..), полученный из частичного совпадения строки в "имени элемента".

SQL База данных

Я создал новый столбец в обоих моих Pandas dataframe и SQL база данных, которыми я мог бы манипулировать, чтобы получить эту информацию, но у меня нет знаний для этого.

Запрос, который я использовал в SQL, выглядит следующим образом:

ALTER TABLE public.all_beers_specs
ADD "Sub_Category" text;

UPDATE public.all_beers_specs
SET "Sub_Category" = all_beers_specs."Item Name";

SELECT "Sub_Category" from public.all_beers_specs
WHERE "Item Name" like '%IPA%';

ВЫХОД:

Sub_Category
11 Below Hipster Sauce IPA 
21st Amendment Brew Free Or Die IPA 
21st Amendment Orange Brew Free IPA 
4th Tap Double Dry Hopped Double Dragon IPA 
4th Tap Kung Fu Robot IPA 

Вместо того, чтобы иметь полное название пива в столбце, я хотел бы обрезать его и иметь только IPA. Я хотел бы повторить этот процесс для многих разных сортов пива, чтобы получить аналогичный результат.

РЕДАКТИРОВАТЬ # 1:

Вот решение, которое я придумал в python:

КОД:


dataframe = pd.read_csv(path_to_my_dataframe.csv')
#print(dataframe)


list_of_beers = dataframe['Item Name'].to_list() 


lower_case_list = [x.upper() for x in list_of_beers]

#creating a list to append results
subcategory_list =[]
for b in lower_case_list:
    #print(b)
    if 'IPA' in b:
        ipa = 'IPA'
        subcategory_list.append(ipa)
    else:
        if 'ALE' in b:
            ale = 'ALE'
            subcategory_list.append(ale)
        else:
            if 'STOUT' in b:
                stout = 'STOUT'
                subcategory_list.append(stout)

ВЫХОД:

 Token                                  Item Name  ...   Price Sub_Category
0       NaN                    11 Below 7 Iron Blonde   ...   $8.82          N/A
1       NaN             11 Below Big Mistake Ba Stout   ...   $8.41        STOUT
2       NaN                11 Below Hipster Sauce IPA   ...   $9.78          IPA
3       NaN          11 Below Java Space Coffee Stout   ...  $12.48        STOUT
4       NaN               11 Below Lame Duck Pale Ale   ...   $8.76          ALE
...     ...                                        ...  ...     ...          ...
2899    NaN          Zilker Brewing Coffee Milk Stout   ...   $8.94        STOUT
2900    NaN  Zilker Brewing Friends With Benefits IPA   ...  $12.78          IPA
2901    NaN                  Zilker Brewing Marco IPA   ...   $8.94          IPA
2902    NaN     Zilker Brewing Parks and Rec Pale Ale   ...   $8.94          ALE
2903    NaN                  Zilker Heavenly Daze IPA   ...  $10.92          IPA

Я уверен, что есть более эффективный способ классификации пива вместо бесконечных операторов if else, возможно, с использованием класса или определение функции?

Кроме того, для записей 4 и 2902 я хотел бы, чтобы они были классифицированы как PALE ALE, а не просто ALE. Я попытался добавить

if 'ALE' != 'PALE ALE' in B:
   ALE = ALE

Есть ли способ точно сопоставить / отфильтровать эти символы этих строк?

1 Ответ

0 голосов
/ 17 июня 2020

Рассмотрим чистый SQL условный CASE оператор в UPDATE. Либо запустите под одним оператором в Postgres, либо вызовите его через Python. Оставьте pandas для аналитики данных!

UPDATE public.all_beers_specs
SET "Sub_Category" = CASE 
                          WHEN all_beers_specs."Item Name" LIKE '%IPA%'      THEN 'IPA'
                          WHEN all_beers_specs."Item Name" LIKE '%Pale Ale%' THEN 'Pale Ale'
                          WHEN all_beers_specs."Item Name" LIKE '%Ale%'      THEN 'Ale'
                          WHEN all_beers_specs."Item Name" LIKE '%Lager%'    THEN 'Lager'
                          WHEN all_beers_specs."Item Name" LIKE '%Pilsner%'  THEN 'Pilsner'
                          WHEN all_beers_specs."Item Name" LIKE '%Stout%'    THEN 'Stout'
                          WHEN all_beers_specs."Item Name" LIKE '%Porter%'   THEN 'Porter'
                          ELSE NULL
                     END
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...