У меня есть кадр данных 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
Вы можете 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']
np.where
может обрабатывать только два элементаnp.select
. Я могу показать