Суммирование значений строки на основе подстроки в столбце - PullRequest
0 голосов
/ 20 июня 2020

У меня есть Dataframe, содержащий транзакции из учетной записи, и мне нужно распределить их по категориям и суммировать каждую категорию. Всего у меня 8 категорий, в каждой может быть 10+ ключевых слов. Я нашел на этом сайте сообщения, которые sh выполняли нечто подобное, но у них есть свои оговорки.

df['Contains string'] = (df[columns].apply(lambda x: x.str.contains('myString'))).sum(axis=1)

Это самое близкое, что я могу найти, но оно не позволяет использовать несколько ключевых слов или категорий.

Примеры категорий:

Phone payment - contains string "ATT Payment"
Supplies - contains string "EBAY" or "BIZCARD" or "AMAZON" or etc.

DataFrame может иметь неограниченное количество строк, но образец выглядит так:

                                         TransactionID    Debit   Credit
0                                   ATT Payment ID 001     0.00    21.29
1                                      BIZCARD PAYMENT     0.00   124.93
2                                          Check #1867  8755.50     0.00
3                                          Check #1874   110.66     0.00
5                                          EBAY ID 544     0.00    36.00
6                                        AMAZONPAY 788     0.00   373.20

Столбец кредита будет только то, что требует суммирования значений.

Желаемый результат:

Phone Payment = 21.29  
Supplies = 534.13
Etc. = 00

Новое в Python. Простите за недостаток или избыток информации. Спасибо.

Ответы [ 2 ]

2 голосов
/ 20 июня 2020

Используйте pandas .Series.str.contains

  • .contains() затем используется для индексирования и выбора данных
  • Создайте маску для каждого набора требуемых ограничений
  • Затем маски можно использовать с ~, то есть not, для данных etc.
import pandas as pd

# create dataframe
data = {'TransactionID': ['ATT Payment ID 001', 'BIZCARD PAYMENT', 'Check #1867', 'Check #1874', 'EBAY ID 544', 'AMAZONPAY 788'],
        'Debit': [0.0, 0.0, 8755.5, 110.66, 0.0, 0.0],
        'Credit': [21.29, 124.93, 0.0, 0.0, 36.0, 373.2]}

df = pd.DataFrame(data)

# Get rows based on criteria of contains
phone_payment_mask = df.TransactionID.str.contains('ATT')
phone_payment = df.Credit[phone_payment_mask]
print(phone_payment.sum())
21.29

supplies_mask = df.TransactionID.str.contains('EBAY|BIZCARD|AMAZON')
supplies = df.Credit[supplies_mask]
print(supplies.sum())
534.13

etc = df.Credit[~phone_payment_mask & ~supplies_mask]
print(etc.sum())
0.0
0 голосов
/ 20 июня 2020

Вы можете начать с добавления столбца категории, как описано в этот ответ (используйте .str.contains вместо .isin)

Затем вы можете вычислить сумму, используя groupby:

df.groupby('Category_column').Credit.sum()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...