Фрейм данных, как обновить столбец на основе многих значений str - PullRequest
0 голосов
/ 01 июля 2019

Я создаю небольшую программу управления финансами, которая импортирует мои транзакции из CSV в Python. Я хочу присвоить значения новому столбцу 'category' на основе строк, найденных в столбце 'details' . Я могу сделать это для одного, но мой вопрос, как мне это сделать, если у меня был огромный список возможных строк? Например, str.contains('RALPHS') заменит значение этого столбца на "бакалейные товары" и т. Д.

Например, ниже у меня есть список строк:

dining = ['CARLS', 'SUBWAY', 'DOMINOS']

и если какая-либо из этих строк будет найдена в моей серии, то она обновит серию соответствующей категории до «обеденная».

Вот небольшой пример запуска ниже.

import pandas as pd
import numpy as np

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
str_xfer = 'TRANSFER'
df['category'] = (df['details'].str.contains(str_xfer)).astype(int)
df['category'] = df['category'].replace(
                                                            to_replace=1,
                                                            value='transfer')

df

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

Большое спасибо.

Ответы [ 2 ]

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

Если у вас есть одно значение, мы можем использовать str.extract:

df['category'] = df['details'].str.extract(f'({str_xfer})')
   amount          details  category
0  -68.23  PAYPAL TRANSFER  TRANSFER
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  TRANSFER
5  -64.29  PAYPAL TRANSFER  TRANSFER

Если у вас есть несколько строк для сопоставления, мы должны сначала разделить ваши строки с помощью |, который является оператором или в регулярных выражениях.

str_xfer = ['TRANSFER', 'RALPHS', 'CASHOUT']
str_xfer = '|'.join(str_xfer)

df['category'] = df['details'].str.extract(f'({str_xfer})')
   amount          details  category
0  -68.23  PAYPAL TRANSFER  TRANSFER
1  -12.46     RALPHS #0079    RALPHS
2   -8.51   SAVE AS YOU GO       NaN
3   25.34    VENMO CASHOUT   CASHOUT
4   -2.23  PAYPAL TRANSFER  TRANSFER
5  -64.29  PAYPAL TRANSFER  TRANSFER
1 голос
/ 01 июля 2019

Я думаю, вам нужно str.findall

df['category']=df.details.str.findall('TRANSFER').str[0].fillna(0)
df
   amount          details  category
0  -68.23  PAYPAL TRANSFER  TRANSFER
1  -12.46     RALPHS #0079         0
2   -8.51   SAVE AS YOU GO         0
3   25.34    VENMO CASHOUT         0
4   -2.23  PAYPAL TRANSFER  TRANSFER
5  -64.29  PAYPAL TRANSFER  TRANSFER

Если у вас есть более одной строки в str_xfer добавление '|'

df.details.str.findall('TRANSFER|VENMO').str[0]
0    TRANSFER
1         NaN
2         NaN
3       VENMO
4    TRANSFER
5    TRANSFER
Name: details, dtype: object
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...