使用Pandas GroupBy和size()/ count()生成聚合的DataFrame

时间:2014-12-02 05:26:13

标签: python pandas group-by dataframe

所以我目前有一个名为df的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()

我知道哪个标签存在等。任何帮助将不胜感激。

更新(面向未来的人):

结束日期时间,而不是字符串格式。相信我,在绘图时会更好:

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)

1 个答案:

答案 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