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

1

У меня есть кадр данных 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
Теги:
pandas
python-3.x
pandas-groupby

1 ответ

2
Лучший ответ

Вы можете groupby с помощью булевой маскировки

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

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

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']
  • 0
    Это очень мило. Очень элегантный. Что делать, если у меня есть два типа и один остаток? Насколько я вижу, np.where может обрабатывать только два элемента
  • 0
    Затем используйте np.select . Я могу показать
Показать ещё 3 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню