2014-12-02 3 views
3

Так что я в настоящее время имеют DataFrame под названием df, который идет:Использование панды GroupBy и размер()/количество() для создания агрегированного DataFrame

date      tag 
2011-02-18 12:57:00-07:00 A 
2011-02-19 12:57:00-07:00 A 
2011-03-18 12:57:00-07:00 B 
2011-04-01 12:57:00-07:00 C 
2011-05-19 12:57:00-07:00 Z 
2011-06-03 12:57:00-07:00 A 
2011-06-05 12:57:00-07:00 A 
... 

Я пытаюсь сделать GroupBy тег, и дата (год/месяц), так что это выглядит следующим образом:

date  A B C Z 
2011-02 2 0 0 0 
2011-03 0 1 0 0 
2011-04 0 0 1 0 
2011-05 0 0 0 1 
2011-06 2 0 0 0 
... 

Я попытался следующие, но это не совсем дать мне то, что я хочу.

grouped_series = df.groupby([["%s-%s" % (d.year, d.month) for d in df.date], df.tag]).size() 

Я знаю, какой тег существует и т.д. Любая помощь будет принята с благодарностью.

UPDATE (для тех, кто хочет в будущем):

Законченное сохраняя DateTime, а не формат строки. Поверьте мне, это будет лучше, когда черчения:

grouped_df = df.groupby([[ datetime.datetime(d.year, d.month, 1, 0, 0) for d in df.date], df.name]).size() 
grouped_df = grouped_df.unstack().fillna(0) 

ответ

3

вы могли бы использовать unstack() и fillna() методы:

>>> g = df.groupby([["%s-%s" % (d.year, d.month) for d in df.date], df.tag]).size() 
>>> g 
     tag 
2011-2 A  2 
2011-3 B  1 
2011-4 C  1 
2011-5 Z  1 
2011-6 A  2 
dtype: int64 
>>> g.unstack().fillna(0) 
tag  A B C Z 
2011-2 2 0 0 0 
2011-3 0 1 0 0 
2011-4 0 0 1 0 
2011-5 0 0 0 1 
2011-6 2 0 0 0 
Смежные вопросы