2013-12-06 4 views
2

у меня есть dataframe («кадр»), на котором я хочу объединить по стране и дата:панды dataframe GroupBy: сумма/кол-только положительных чисел

aggregated=pd.DataFrame(frame.groupby(['Country','Date']).CaseID.count()) 

aggregated["Total duration"]=frame.groupby(['Country','Date']).Hours.sum() 

aggregated["Mean duration"]=frame.groupby(['Country','Date']).Hours.mean() 

Я хочу, чтобы вычислить вышеуказанные цифры (всего продолжительность, средняя продолжительность и т. д.) только для положительных чисел «Часы» в «кадре». Как я могу это сделать?

Спасибо!

Образец "кадр"

import pandas as pd 
Line1 = {"Country": "USA", "Date":"01 jan", "Hours":4} 
Line2 = {"Country": "USA", "Date":"01 jan", "Hours":3} 
Line3 = {"Country": "USA", "Date":"01 jan", "Hours":-999} 
Line4 = {"Country": "Japan", "Date":"01 jan", "Hours":3} 
pd.DataFrame([Line1,Line2,Line3,Line4]) 
+0

просьба предоставить образец dataframe и ожидаемый результат – alko

+0

"кадр" выглядит следующим образом: Дата, страна, Часы 01/01/2012, США, 4 01/01/2012, США, 3 01/01/2012, USA, -999 01/01/2012, Япония, 3 Выход «агрегированный» должен выглядеть следующим образом: Дата, страна, граф, количество_положителей, общая продолжительность, средняя продолжительность 01/01/2012, США, 3,2,7,3,5 01/01/2012, Япония, 1,1,3,3 –

+0

Обратите внимание: '' предоставить dataframe'' означает некоторый действительный код python для его восстановления. – alko

ответ

6

не так элегантно, как указано выше, но дело иначе некоторые частные случаи. df означает frame из оригинального вопроса.

>>> df.groupby(['Country','Date']).agg(lambda x: x[x>0].mean()) 
       Hours 
Country Date 
Japan 01 jan 3.0 
USA  01 jan 3.5 
>>> df.ix[3, 'Hours'] = -1 
>>> df.groupby(['Country','Date']).agg(lambda x: x[x>0].mean()) 
       Hours 
Country Date 
Japan 01 jan NaN 
USA  01 jan 3.5 
+0

. Лучшим подходом было бы просто использовать «NaN» в качестве контрольного значения вместо '-999', а затем сделать не фильтровать вообще и использовать функции 'nanmean' или другие' nan'-insensitive stats, которые имеют неявную, более быструю фильтрацию уже внутри них. Но я понимаю, что вы берете данные как данные из вопроса OP. – ely

+0

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

5

Как насчет -

frame[frame["Hours"] > 0].groupby(['Country','Date']) 
Смежные вопросы