2013-12-05 5 views
1

У меня есть панд dataframe вроде этого:Панды GroupBy среднее абсолютное отклонение

Product Group Product ID Units Sold Revenue Rev/Unit 
A    451   8    $16  $2 
A    987   15   $40  $2.67 
A    311   2    $5   $2.50 
B    642   6    $18  $3.00 
B    251   4    $28  $7.00 

Я хочу, чтобы преобразовать его выглядеть следующим образом:

Product Group Units Sold Revenue Rev/Unit Mean Abs Deviation 
A    25   $61  $2.44  $0.24 
B    10   $46  $4.60  $2.00 

Колонка Отклонение Средние Abs должны быть выполнены на столбец «Rev/Unit» в первой таблице. Трудная вещь заключается в учете соответствующих весов за расчётом Rev/Unit.

Например, если взять прямой MAD ​​из Rev/Unit группы продуктов A, то получится 0,26 доллара США. Однако после учета веса MAD составит 0,24 доллара США.

Я знаю, как использовать groupby, чтобы получить простое суммирование для проданных единиц и доходов, но я немного потерял, как выполнить более сложные вычисления следующих двух столбцов.

Также, когда мы даем совет/помощь --- есть ли более простой способ создания/вставки таблиц в сообщения SO?

UPDATE:

Будет ли решение нравится эта работа? Я знаю, что это будет для полей суммирования, но не уверен, как реализовать для последних 2 поля.

grouped_df=df.groupby("Product Group") 
grouped_df.agg({ 
    'Units Sold':'sum', 
    'Revenue':'sum', 
    'Rev/Unit':'Revenue'/'Units Sold', 
    'MAD':some_function}) 

ответ

0

вам нужно уточнить, что такое «вес» является, я предположил, что веса количества проданных единиц, но дают разные результаты твое:

pv = df.pivot_table(rows='Product Group', 
        values=[ 'Units Sold', 'Revenue' ], 
        aggfunc=sum) 
pv[ 'Rev/Unit' ] = pv.Revenue/pv[ 'Units Sold' ] 

это дает:

   Revenue Units Sold Rev/Unit 
Product Group        
A     61   25  2.44 
B     46   10  4.60 

Что касается WMAD:

def wmad(prod): 
    idx = df[ 'Product Group' ] == prod 
    w = df[ 'Units Sold' ][ idx ] 
    abs_dev = np.abs (df[ 'Rev/Unit' ][ idx ] - pv[ 'Rev/Unit' ][ prod ]) 
    return sum(abs_dev * w)/sum(w) 

pv[ 'Mean Abs Deviation' ] = [ wmad(idx) for idx in pv.index ] 

, который, как я уже дает другой результат

   Revenue Units Sold Rev/Unit Mean Abs Deviation 
Product Group             
A     61   25  2.44    0.2836 
B     46   10  4.60    1.9200 
+0

Есть ли способ вставить функцию в метод agg? См. Отредактированный OP для более подробной информации. – ChrisArmstrong

+0

Вы можете использовать функцию лямбда, вызывая при необходимости полную функцию. – Mike

0

От вашего Предложенное решение, вы можете использовать функцию лямбда для работы на каждой строке, например:

'Rev/Unit': lambda x: calculate_revenue_per_unit(x) 

Имейте в виду, что х является кортежем для каждая строка, поэтому вам нужно будет распаковать ее в вашей функции calculate_revenue_per_unit.

Смежные вопросы