Как объединить общие строки в DataFrame - PullRequest
0 голосов
/ 11 июля 2020

Я провожу некоторый анализ банковских выписок (CSV). У некоторых предметов, таких как McDonalds, есть своя строка (из-за разных адресов).

Я пытаюсь объединить эти строки общей фразой. Итак, для этого примера очевидной фразой или строкой будет «McDonalds». Я думаю, это будет оператор if.

Кроме того, столбец имеет dtype «объект». Придется ли мне преобразовать его в строковый формат?

Вот пример вывода результата печати totali = df.Item.value_counts() из моего кода.

В идеале я бы хотел, чтобы эта строка выводила McDonalds как всего одна строка. В csv это 2 отдельные строки.

foo                                   14
Restaurant Boulder CO                  8
McDonalds Boulder CO                   5
McDonalds Denver CO                    5

Вот из чего состоят данные столбца

'Sukiya Greenwood Vil CO' 'Sei 34179 Denver CO'  'Chambers Place Liquors 303-3731100 CO'  "Mcdonald's F26593 Fort Collins CO"  'Suh Sushi Korean Bbq Fort Collins CO'  'Conoco - Sei 26927 Fort Collins CO'

1 Ответ

0 голосов
/ 12 июля 2020

ОК. Думаю, я приготовил кое-что, что может быть полезно. Поймите, что задача определения категорий или имен из текстовых строк может быть огромной, в зависимости от того, насколько подробными вы хотите получить информацию. Вы можете погрузиться в regex или другие модели обучения. Люди делают из этого карьеру! Очевидно, ваш банк делает что-то из этого, поскольку он классифицирует вещи, когда вы получаете сводку на конец года. хотите сделать.

import pandas as pd


item=['McDonalds Denver', 'Sonoco', 'ATM Fee', 'Sonoco, Ft. Collins', 'McDonalds, Boulder', 'Arco Boulder']
txn = [12.44, 4.00, 3.00, 14.99, 19.10, 52.99]
df = pd.DataFrame([item, txn]).T
df.columns = ['item_orig', 'charge']
print(df)

# let's add an extra column to catch the conversions...
df['item'] = pd.Series(dtype=str)

# we'll use the "contains" function in pandas as a simple converter...  quick demo
temp = df.loc[df['item_orig'].str.contains('McDonalds')]
print('\nitems that containt the string "McDonalds"')
print(temp)

# let's build a simple conversion table in a dictionary
conversions = { 'McDonalds': 'McDonalds - any',
                'Sonoco': 'gas',
                'Arco': 'gas'}

# let's loop over the orig items and put conversions into the new column
# (there is probably a faster way to do this, but for data with < 100K rows, who cares.)
for key in conversions:
    df['item'].loc[df['item_orig'].str.contains(key)] = conversions[key]

# see how we did...
print('converted...')
print(df)

# now move over anything that was NOT converted
# in this example, this is just the ATM Fee item...
df['item'].loc[df['item'].isnull()] = df['item_orig']


# now we have decent labels to support grouping!
print('\n\n  *** sum of charges by group ***')
print(df.groupby('item')['charge'].sum())

Выход:

             item_orig charge
0     McDonalds Denver  12.44
1               Sonoco      4
2              ATM Fee      3
3  Sonoco, Ft. Collins  14.99
4   McDonalds, Boulder   19.1
5         Arco Boulder  52.99

items that containt the string "McDonalds"
            item_orig charge item
0    McDonalds Denver  12.44  NaN
4  McDonalds, Boulder   19.1  NaN
converted...
             item_orig charge             item
0     McDonalds Denver  12.44  McDonalds - any
1               Sonoco      4              gas
2              ATM Fee      3              NaN
3  Sonoco, Ft. Collins  14.99              gas
4   McDonalds, Boulder   19.1  McDonalds - any
5         Arco Boulder  52.99              gas


  *** sum of charges by group ***
item
ATM Fee             3.00
McDonalds - any    31.54
gas                71.98
Name: charge, dtype: float64
...