2015-05-28 2 views
0

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

data = data.groupby(['type', 'name']).agg({'values': [np.min, np.max, 100 * sum([('values' > 3200)]/[np.size])]}) 

Формула Я пытаюсь вычислить ниже:

100 * sum((values > 3200)/(np.size)) 

Это где нп является размер агрегации (числа агрегированных ограничены числами> 3200). Как выполнить вычисления, подобные этому в рамках агрегатов, будет очень полезной.

Пример входных данных (фактический набор данных намного больше). Значения повторения связаны с агрегацией.

type, name, values 
apple, blue, 2500 
orange, green, 2800 
peach, black, 3300 
lemon, white, 3500 

Желаемая пример вывода (цифры не правильно из-за того, что я до сих пор не в состоянии выполнить расчет):

type, name, values, np.min, np.max, calcuation 
apple, blue, 2500, 1200, 40000, 2300 
orange, green, 2800, 1200, 5000, 2500 
+0

Можете ли вы дать больше описания на вашем прецеденте? Например, входные данные и желаемый результат, я думаю, что упоминание об «агрегации» может быть путаным в этом случае. – dave

+0

небольшой рабочий фрагмент был бы полезен, чтобы знать, что вы пытаетесь сделать. – user1269942

+0

данные обновляются. Остальная часть кода - просто простое извлечение из базы данных и помещается в pandas df – user2524994

ответ

1

Passing df.agg словаря используется для указания имя столбцов вывода, здесь вы, по сути, записываете функцию агрегации, которая пытается использовать три формулы для одного столбца с именем, и этот столбец уже находится в вашем фреймворке данных, поэтому он будет терпеть неудачу.

То, что вы должны делать, должны выглядеть как:

data = data.groupby(['type', 'name']).agg({'min':np.min, 'max':np.max, 'calculation': calculation}) 

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

+0

в любом случае вы могли бы привести мне пример функции с numpy, реализованной в ней? – user2524994

+0

Аналогичные вопросы, которые приведут вам примеры для работы от: http://stackoverflow.com/questions/26812763/applying-a-custom-groupby-aggregate-function-to-output-a-binary-outcome-in-panda http://stackoverflow.com/questions/10951341/pandas-dataframe-aggregate-function-using-multiple-columns –

0

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

func = lambda series: 100* (series > 3200).mean(); 
data.groupby(['type', 'name']).values.agg({'min': min, 'max': max, 'calculation': func}) 

Среднее булева вектора дает процент True значений, что является лучшим способом его вычисления. Кроме того, вы можете передавать общие имена функций, такие как min и max, как строки.