Кадр данных Обновление столбца до имени категории на основе списка строковых значений в этой категории - PullRequest
2 голосов
/ 01 июля 2019

У меня есть списки, которые классифицированы по имени, например:

dining = ['CARLS', 'SUBWAY', 'PIZZA']
bank = ['TRANSFER', 'VENMO', 'SAVE AS YOU GO']

, и я хочу обновить новый столбец для имени категории, если какая-либо из этих строк найдена в другом столбце.Пример из моего другого вопроса здесь , у меня есть следующий набор данных (пример списка банковских операций):

import pandas as pd
import numpy as np

dining = ['CARLS', 'SUBWAY', 'PIZZA']
bank = ['TRANSFER', 'VENMO', 'SAVE AS YOU GO']

data = [
    [-68.23 , 'PAYPAL TRANSFER'],
    [-12.46, 'RALPHS #0079'],
    [-8.51, 'SAVE AS YOU GO'],
    [25.34, 'VENMO CASHOUT'],
    [-2.23 , 'PAYPAL TRANSFER'],
    [-64.29 , 'PAYPAL TRANSFER'],
    [-7.06, 'SUBWAY'],
    [-7.03, 'CARLS JR'],
    [-2.35, 'SHELL OIL'],
    [-35.23, 'CHEVRON GAS']
]

df = pd.DataFrame(data, columns=['amount', 'details'])
df['category'] = np.nan
df

    amount  details             category
0   -68.23  PAYPAL TRANSFER     NaN
1   -12.46  RALPHS #0079        NaN
2   -8.51   SAVE AS YOU GO      NaN
3   25.34   VENMO CASHOUT       NaN
4   -2.23   PAYPAL TRANSFER     NaN
5   -64.29  PAYPAL TRANSFER     NaN
6   -7.06   SUBWAY              NaN
7   -7.03   CARLS JR            NaN
8   -2.35   SHELL OIL           NaN
9   -35.23  CHEVRON GAS         NaN

Есть ли эффективный способ для меня обновить столбец категории либо'Dining' или 'Bank' в зависимости от того, найдены ли строки в списке в data.details?

I.e. Desired Output:
    amount  details             category
0   -68.23  PAYPAL TRANSFER     bank
1   -12.46  RALPHS #0079        NaN
2   -8.51   SAVE AS YOU GO      bank
3   25.34   VENMO CASHOUT       bank
4   -2.23   PAYPAL TRANSFER     bank
5   -64.29  PAYPAL TRANSFER     bank
6   -7.06   SUBWAY              dining
7   -7.03   CARLS JR            dining
8   -2.35   SHELL OIL           NaN
9   -35.23  CHEVRON GAS         NaN

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

Ответы [ 2 ]

3 голосов
/ 01 июля 2019

Мы можем сделать это с np.select, поскольку у нас есть несколько условий:

dining = '|'.join(dining)
bank = '|'.join(bank)

conditions = [
    df['details'].str.contains(f'({dining})'),
    df['details'].str.contains(f'({bank})')
]

choices = ['dining', 'bank']

df['category'] = np.select(conditions, choices, default=np.NaN)

   amount          details category
0  -68.23  PAYPAL TRANSFER     bank
1  -12.46     RALPHS #0079      nan
2   -8.51   SAVE AS YOU GO     bank
3   25.34    VENMO CASHOUT     bank
4   -2.23  PAYPAL TRANSFER     bank
5  -64.29  PAYPAL TRANSFER     bank
6   -7.06           SUBWAY   dining
7   -7.03         CARLS JR   dining
8   -2.35        SHELL OIL      nan
9  -35.23      CHEVRON GAS      nan
2 голосов
/ 01 июля 2019

Вы можете сделать с findall + dict map

sub = {**dict.fromkeys(dining, 'dining'), **dict.fromkeys(bank, 'bank')}
df.details.str.findall('|'.join(sub)).str[0].map(sub)
Out[146]: 
0      bank
1       NaN
2      bank
3      bank
4      bank
5      bank
6    dining
7    dining
8       NaN
9       NaN
Name: details, dtype: object

#df['category'] = df.details.str.findall('|'.join(sub)).str[0].map(sub)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...