Функции GroupBy в Python Pandas, такие как SUM (col_1 * col_2), средневзвешенное значение и т. Д.

Можно ли напрямую рассчитать произведение (или, например, сумму) двух столбцов, не используя

<code>grouped.apply(lambda x: (x.a*x.b).sum()
</code>

Это намного (меньше, чем половина времени на моей машине) быстрее использовать

<code>df['helper'] = df.a*df.b
grouped= df.groupby(something)
grouped['helper'].sum()
df.drop('helper', axis=1)
</code>

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

<code>grouped.apply(lambda x: (x.a*x.b).sum()/(df.b).sum())
</code>

и снова намного медленнее, чем деление помощника на b.sum ().

Ответы на вопрос(3)

Ответ пришел через много лет черезпидата блейз

from blaze import *
data = Data(df)
somethings = odo(
by(data.something, 
   wm = (data.a * data.weights).sum()/data.weights.sum()),
pd.DataFrame)

Как насчет прямой группировки результата x.a * x.b, например:

from pandas import *
from numpy.random import randn
df = DataFrame({'A' : ['foo', 'bar', 'foo', 'bar',
               'foo', 'bar', 'foo', 'foo'],
        'B' : ['one', 'one', 'two', 'three',
               'two', 'two', 'one', 'three'],
        'C' : randn(8), 'D' : randn(8)})

print (df.C*df.D).groupby(df.A).sum()
 Arthur G07 апр. 2012 г., 16:37
Это работает, конечно. Но я подозреваю, что сначала весь вектор CD is built in memory, then it is grouped and then summed. I wouldn't have to do this if I could efficiently walk through the rows, summing the c_id_i (или только построение C * D по группам, а затем суммируйте их, проходя через группы).
Решение Вопроса

Я хочу в конечном итоге построить встроенный анализатор выражений массива (Numexpr на стероидах), чтобы делать такие вещи. Прямо сейчас мы работаем с ограничениями Python - если вы реализовали агрегатор Cython, чтобы сделать(x * y).sum() тогда это может быть связано с groupby, но в идеале вы можете написать выражение Python как функцию:

def weight_sum(x, y):
    return (x * y).sum()

и это будет "JIT-скомпилировано" и быть примерно таким же быстрым, как groupby (...). sum (). То, что я описываю, является довольно значительным (много месяцев) проектом. Если бы была реализация APL, совместимая с BSD, я мог бы сделать что-то подобное выше, чем раньше (просто подумав вслух).

Ваш ответ на вопрос