Pandas: Группировка строк по списку в файле CSV? - PullRequest
1 голос
/ 25 февраля 2020

Чтобы немного облегчить нашу бюджетную жизнь и помочь себе учиться; Я создаю небольшую программу в python, которая берет данные из нашего экспортированного банка CSV.

Я приведу пример того, что я хочу сделать с этими данными. Скажем, я хочу сгруппировать все расходы на фаст-фуд вместе. В столбце описания есть много разных имен с разными итогами, но я хочу, чтобы все они были сведены в таблицу как один счет «быстрого питания».

Например, Csv настроен так:

Date             Description           Debit    Credit
1/20/20      POS PIN BLAH BLAH ###     1.75      NaN

Я выяснил, как сгруппировать их с помощью оператора или:

contains = df.loc[df['Description'].str.contains('food court|whataburger', flags = re.I, regex = True)]

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

Я пробовал что-то вроде:

fast_food = ['Macdonald', 'Whataburger', 'pizza hut']

Это, очевидно, не t работа.

Если есть лучший способ сделать это, я широко открыт для предложений.

Также я просмотрел довольно много постов здесь в стеке и до сих пор не нашел ответа (хотя я уверен, что я упустил это из виду)

Любая помощь будет принята с благодарностью. Я все еще учусь.

Спасибо

Ответы [ 2 ]

1 голос
/ 25 февраля 2020

Вы можете назначить новый столбец, используя str.extract, а затем groupby:

df = pd.DataFrame({"description":['Macdonald something', 'Whataburger something', 'pizza hut something',
                                  'Whataburger something','Macdonald something','Macdonald otherthing',],
                   "debit":[1.75,2.0,3.5,4.5,1.5,2.0]})

fast_food = ['Macdonald', 'Whataburger', 'pizza hut']

df["found"] = df["description"].str.extract(f'({"|".join(fast_food)})',flags=re.I)

print (df.groupby("found").sum())

#
             debit
found             
Macdonald     5.25
Whataburger   6.50
pizza hut     3.50
1 голос
/ 25 февраля 2020

Использование динамического c построения шаблона:

fast_food = ['Macdonald', 'Whataburger', 'pizza hut']
pattern = r"\b(?:{})\b".format("|".join(map(re.escape, fast_food)))    
contains = df.loc[df['Description'].str.contains(pattern, flags = re.I, regex = True)]

Границы \b слова находят целые слова, а не частичные слова.

re.escape защитит специальные символы, и они будет проанализирован как буквенные символы.

Если \b не работает для вас, проверьте другие подходы на Совпадение всего слова в строке с использованием Dynami c regex

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...