#python #pandas
#питон #панды
Вопрос:
Я хочу найти эквивалент pandas sql…
select sum(t.col1 * t.col2) / sum(t.col3) from table as t group by t.col4
Я так и сделал
df.groupby(['col4'])[['col3']].sum()
но это дает только сумму (т.3)…
существует ли однострочный оператор для решения такого рода задач в pandas?
Комментарии:
1. пожалуйста, предоставьте данные с ожидаемым результатом. Это выглядит как нечто, чего можно достичь с помощью
transform
, но данные делают это более конкретным и легким для расшифровки
Ответ №1:
Попробуйте:
df['n'] = df['col1'].mul(df['col2'])
gr = df.groupby(['col4'])
res = gr['n'].sum().div(gr['col3'].sum())
Ответ №2:
Попробуй это:
df_grouped = df.groupby(['col4'])
col1 = df_grouped['col1']
col2 = df_grouped['col2']
col3 = df_grouped['col3']
col1col2 = col1.mul(col2).sum()
res = col1col2.div(col3.sum())
Я не уверен, правильно это или нет, но я надеюсь, что это поможет.
Комментарии:
1. Эта строка завершится ошибкой:
col1col2 = col1.mul(col2).sum()
— как только вы это исправите, вы получите мой ответ…2. У меня не было времени попробовать это. Можете ли вы объяснить, почему это приведет к сбою?
3. Потому что
.mul()
любая другая арифметическая операция реализуется дляpandas.Series
, в конечном счетеpandas.DataFrame
, тогда как при вызове.groupby()
вы создаете этот сгруппированный объект, который по сути аналогиченdict
, где ключи являются сгруппированными столбцами, а значения — фреймами данных, связанными с отдельной группой — в нем не намного больше — короче говоря, это промежуточное состояние…