如何使用Pandas按月份和年份对行进行分组和计数?

42

我有一个包含个人数据的数据集,例如姓名、身高、体重和出生日期。我想建立一个图表,显示特定月份和年份出生的人数。我使用Python Pandas来完成这个任务,我的策略是尝试按年份和月份分组并使用计数相加。但是我最接近的结果是按年份或按月份计算人数,而不是两者同时。

df['birthdate'].groupby(df.birthdate.dt.year).agg('count')

stackoverflow中的其他问题指向了一个名为TimeGrouper的分组器,但在pandas文档中搜索未找到相关内容。有什么想法吗?

5个回答

73

要按多个条件进行分组,请传递列或条件的列表:

df['birthdate'].groupby([df.birthdate.dt.year, df.birthdate.dt.month]).agg('count')

例子:

In [165]:
df = pd.DataFrame({'birthdate':pd.date_range(start=dt.datetime(2015,12,20),end=dt.datetime(2016,3,1))})
df.groupby([df['birthdate'].dt.year, df['birthdate'].dt.month]).agg({'count'})

Out[165]:
                    birthdate
                        count
birthdate birthdate          
2015      12               12
2016      1                31
          2                29
          3                 1

更新

从版本0.23.0开始,由于多层索引级别名称必须唯一的限制,上述代码将不再起作用,现在您需要重命名级别才能使其正常工作:

In[107]:
df.groupby([df['birthdate'].dt.year.rename('year'), df['birthdate'].dt.month.rename('month')]).agg({'count'})

Out[107]: 
           birthdate
               count
year month          
2015 12           12
2016 1            31
     2            29
     3             1

嗨@EdChum - Reinstate Monica,我该如何绘制这些数据? - Adam Iqshan
@AdamIqshan 抱歉,您应该提出一个新问题,而不是使用评论。 - EdChum

34

您也可以使用“monthly”周期与dt访问器一起使用to_period

In [11]: df = pd.DataFrame({'birthdate': pd.date_range(start='20-12-2015', end='3-1-2016')})

In [12]: df['birthdate'].groupby(df.birthdate.dt.to_period("M")).agg('count')
Out[12]:
birthdate
2015-12    12
2016-01    31
2016-02    29
2016-03     1
Freq: M, Name: birthdate, dtype: int64

值得注意的是,如果datetime是索引(而不是列),您可以使用resample

df.resample("M").count()

15

另一种解决方案是将 birthdate 设置为索引并进行重新取样:

import pandas as pd

df = pd.DataFrame({'birthdate': pd.date_range(start='20-12-2015', end='3-1-2016')})
df.set_index('birthdate').resample('MS').size()

输出:

birthdate
2015-12-01    12
2016-01-01    31
2016-02-01    29
2016-03-01     1
Freq: MS, dtype: int64

3
截至2019年4月:此方法可行,适用于Pandas版本-0.24.x。 df.groupby([df.dates.dt.year.rename('year'), df.dates.dt.month.rename('month')]).size() 用于数据框按照年和月进行分组,并计算每个组的大小。

0

请将日期和计数字段替换为您相应的列名。此代码片段将根据给定参数进行分组、求和和排序。您还可以将频率更改为1M或2M等...

df[['date', 'count']].groupby(pd.Grouper(key='date', freq='1M')).sum().sort_values(by='date', ascending=True)['count']

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接