Фильтр | Группировка | Агрегат

#python #pandas #pandas-groupby #aggregate

Вопрос:

Я выполняю какую-то задачу в pandas python.

У меня есть такие данные:

 col1  |col2  |col3 |col4 |col5 | col6
delhi |assam |"f"  |78.3 |87.1 | B2C
delhi |goa   |"f"  |78.3 |87.1 | B2C
delhi |goa   |"f"  |78.3 |87.1 | B2C
delhi |assam |"f"  |78.3 |87.1 | B2C
up    |assam |"f"  |78.3 |87.1 | B2B
delhi |assam |"f"  |78.3 |87.1 | B2B
 

Теперь я хочу отфильтровать те строки, где col6-это B2C.
После фильтрации я хочу сгруппировать col1 и col2 и суммировать col4 и col5.

Поэтому результат должен быть таким:

 col1  |col2  |col3 |col4 |col5 | col6
delhi |assam |"f"  |156.6|174.2| B2C
delhi |goa   |"f"  |156.6|174.2| B2C
up    |assam |"f"  |78.3 |87.1 | B2B
delhi |assam |"f"  |78.3 |87.1 | B2B
 

Подход, который я пробовал:

 df.loc[df['col6'] == 'B2C'].groupby(['col1', 'col2']).agg({'col4':'sum', 'col5':'sum'})
 

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

Ответ №1:

IIUC, вот один из способов:

 df = df.groupby(['col1', 'col2', 'col3','col6'], sort=False).sum().reset_index()
 

ПРИМЕЧАНИЕ: Если вы просто хотите выполнить агрегацию, где значение в col6 равно эквалайзеру ('B2C') :

 df = pd.concat([df[df.col6.eq('B2C')].groupby(['col1', 'col2', 'col3'],sort=False).sum().reset_index().assign(col6 = 'B2C'), df[df.col6.ne('B2C')]])
 

выход:

      col1    col2 col3  col6   col4   col5
0  delhi   assam   f     B2C  156.6  174.2
1  delhi   goa     f     B2C  156.6  174.2
2  up      assam   f     B2B   78.3   87.1
3  delhi   assam   f     B2B   78.3   87.1
 

Комментарии:

1. Нужно ли нам также принимать col3 в groupby ?

2. Кроме того, что делать, если у меня 100 столбцов, и мне нужна группировка всего по 2 столбцам и агрегация по 3 столбцам, тогда мне нужно упомянуть другие 95 столбцов в groupby или есть какой-то удобный способ сделать это ?

3. также в моем случае в col6 есть пробел в имени столбца, например «col 6». как я могу поместить имя столбца с пробелом в поле назначить?