2015-07-08 3 views
0

Я работаю с набором данных, который выглядит, как показано ниже (значения изменились, и реальный намного больше)лямбда пользовательских агрегатная функция

fruit_type, temp, count 
apple, 12, 4 
apple, 14, 6 
pear, 12, 6 
pear, 16, 2 
grape 12, 5 
peach, 9, 33 
peach 6, 3 

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

data3 = data2.groupby('fruit_type')['count'].agg({ 
    'prob' : lambda count: ((count)/count.sum()), 
    'total' : lambda count: count.size 
    }) 

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

ответ

2

Проблема первая lambda count: count/count.sum(). Он возвращает ту же форму, что и группа, а не агрегирует ее на скаляр.

Вы можете сделать transform вместо agg

import pandas as pd 
import numpy as np 

# suppose this is your df 
df 

Out[83]: 
    fruit_type temp count 
0  apple  12  4 
1  apple  14  6 
2  pear  12  6 
3  pear  16  2 
4  grape  12  5 
5  peach  9  33 
6  peach  6  3 


# prob part 
df['prob'] = df.groupby('fruit_type')['count'].transform(lambda count: ((count)/count.sum())) 

# total part 
df['total_count'] = df.groupby('fruit_type')['count'].transform(lambda count: count.sum()) 

df 

Out[87]: 
    fruit_type temp count prob total_count 
0  apple 12  4 0.4000   10 
1  apple 14  6 0.6000   10 
2  pear 12  6 0.7500   8 
3  pear 16  2 0.2500   8 
4  grape 12  5 1.0000   5 
5  peach  9  33 0.9167   36 
6  peach  6  3 0.0833   36 
+0

Как я могу сделать это агрегирование больше скаляр? – user3609179

+0

@ user3609179 Я добавил некоторый код, чтобы проиллюстрировать, как использовать 'transform'. Кроме того, есть ли какая-то особая причина, почему вы хотите 'size' в' 'total': lambda count: count.size' вместо '.sum()' –

+0

Я хочу, чтобы суммарный итог был фруктовым. Это работает в текущем фрагменте, который вы опубликовали? – user3609179

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