Группировать по столбцу во фрейме данных, но объединять некоторые из этих групп в одну группу - PullRequest
0 голосов
/ 19 октября 2018

У меня есть кадр данных pandas, подобный этому:

RECEIPT   USD    TYPE
      1 10.00   Paper
      2 12.00 Digital
      3  5.00    Note
      4 10.00   Paper
      5 12.00   Paper
      6  5.00 Digital

Если я сгруппирую данные по столбцу TYPE, я получу это:

balance = df.groupby(['TYPE'])['USD'] \
                    .agg(['sum', 'count']) \
                    .reset_index() \
                    .rename(columns={'sum': 'TOTAL', 'count': 'COUNT'})

   TYPE TOTAL COUNT
Digital 17.00     2
Note     5.00     1
Paper   32.00     3

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

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

   TYPE   TOTAL COUNT
Digital   17.00     2
Remainder 37.00     4

1 Ответ

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

Вы можете groupby, используя логическое маскирование

mask = (df.TYPE=='Digital').map({False: 'Remainder', True:'Digital'})

или, используя np.where (что IMO является более элегантным решением)

mask = np.where(df.TYPE=='Digital', 'Remainder', 'Digital')

Оба приведут к

df.groupby(mask)['USD'] \
                        .agg(['sum', 'count']) \
                        .reset_index() \
                        .rename(columns={'sum': 'TOTAL', 'count': 'COUNT'})

    TYPE        TOTAL   COUNT
0   Digital     17.0    2
1   Remainder   37.0    4

Для более чем двух групп вы можете использовать np.select как mask

np.select([df.TYPE == 'Digital', (df.TYPE == 'Paper') | (df.TYPE=='Note'), df.TYPE=='Mail'],
          ['Digital', 'Paper', 'Remainder']
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...