С пандами, как группировать одинаковые и не похожие значения частичных столбцов при определении имен групп - PullRequest
0 голосов
/ 20 октября 2018

Итак, пытаемся провести анализ данных о расходах.Импортировали csv, и первоначальная групповая запись была:

group_df = df.groupby('Who', as_index=False).sum()

Я заметил, что некоторые поставщики используют несколько разные имена и хотят объединить их как часть общей группировки.Соответствующий текст не всегда находится в одной и той же позиции в поле «Кто», и по крайней мере в одном случае я обнаружил, что термины «групповой» в «Кто» совсем не похожи («Рэтбоун» и «Йеринг»).Station ').

                                       Who   Amount
0   DE BORTOLI WINES          DIXONS CREEK  -29.54
1   DE BORTOLI WINES  RE      DIXONS CREEK  -20.50
2   DE BORTOLI WINES P/L      DIXONS CREEK  -22.50
3         DE BORTOLI WINES PTY L    BILBUL  -91.00
4     Ezard@Levantine Hill      Coldstream  -31.30
5     Ezard@LevantineHill       Coldstream  -21.10
6  RATHBONE WINE GROUP       PORT MELBOURN  -20.20
7     YERING STATION            YARRA GLEN  -17.05
8    YERING STATION            YARRA GREEN  -31.00
columns: Index(['Who', 'Amount'], dtype='object')

Вывод, который я хочу:

                                       Who   Amount
0   DE BORTOLI WINES          DIXONS CREEK  -163.54  # all rows containing 'De Bortoli'
1     Ezard@Levantine Hill      Coldstream  -52.40   # all rows containing 'Ezard@'
2  RATHBONE WINE GROUP       PORT MELBOURN  -20.20   # all rows containing 'Rathbone' or 'Yering Station' 
columns: Index(['Who', 'Amount'], dtype='object')

Я изучал документ pandas, примеры веб-сайтов и обмен стека и просто не могу добраться дорешение, которое не выдает ошибку того или иного рода.

Я хочу иметь возможность указать группу «Кто», если это возможно (что, я думаю, делает этот вопрос немного отличным от других примеров, которые явидел).

Мне также интересно, все ли это должно быть сделано за один или два прохода - то есть за два прохода нужно выполнить первоначальную обобщенную группировку на фрейме данных, а затем объединить варианты на выходе groupby.

Правильно ли я подхожу к этому - будет ли лучше выполнить некоторую консолидацию строк в кадре данных, прежде чем пытаться выполнить группировку?

Спасибо за любую помощь!

1 Ответ

0 голосов
/ 20 октября 2018

Один из способов - создать словарь, содержащий ключи поиска, например DE BORTOLI, и определить объединяющие значения, например DE BORTOLI WINES DIXONS CREEK.Затем вы можете создать временный столбец для этого стратифицирующего имени, чтобы информация в столбце Who не терялась, и сгруппировать по этому новому столбцу:

#create dictionary how to translate patterns into categories
#the pattern .* is used as a regex pattern meaning any character before or after this string allowed
transl = {".*DE BORTOLI.*": "DE BORTOLI WINES          DIXONS CREEK", ".*Ezard@.*": "Ezard@Levantine Hill      Coldstream", ".*RATHBONE.*": "RATHBONE AND YERING", ".*YERING.*":"RATHBONE AND YERING"}
#create column with stratified name for grouping
df["strat"] = df["Who"].replace(to_replace = transl, regex = True)
#group and sum
group_df = df.groupby("strat", as_index = False).sum()
print(group_df)

Пример вывода

                                    strat  Amount
0  DE BORTOLI WINES          DIXONS CREEK -163.54
1    Ezard@Levantine Hill      Coldstream  -52.40
2                     RATHBONE AND YERING  -68.25
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...