pandas эквивалент выбора суммы (t.col1 * t.col2) / суммы (t.col3) из таблицы в виде t-группы по t.col4

#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 , где ключи являются сгруппированными столбцами, а значения — фреймами данных, связанными с отдельной группой — в нем не намного больше — короче говоря, это промежуточное состояние…