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

Python 如何使用熊猫按月份和年份对行进行分组和计数?,python,pandas,Python,Pandas,我有一个个人数据集,如姓名、身高、体重和出生日期。我会建立一个图表,显示特定月份和年份出生的人数。我正在使用python pandas来实现这一点,我的策略是尝试按年份和月份分组,并使用count添加。但我得到的最接近的数据是按年或按月计算人数,而不是按两者计算 df['birthdate'].groupby(df.birthdate.dt.year).agg('count') stackoverflow中的其他问题指向一个名为TimeGrouper的石斑鱼,但在pandas文档中搜索没有发现

我有一个个人数据集,如姓名、身高、体重和出生日期。我会建立一个图表,显示特定月份和年份出生的人数。我正在使用python pandas来实现这一点,我的策略是尝试按年份和月份分组,并使用count添加。但我得到的最接近的数据是按年或按月计算人数,而不是按两者计算

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

stackoverflow中的其他问题指向一个名为TimeGrouper的石斑鱼,但在pandas文档中搜索没有发现任何东西。有什么想法吗?

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

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
更新

从版本开始,由于多索引级别名称必须是唯一的限制,上述代码不再有效,您现在需要
重命名
级别,以使其工作:

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

另一种解决方案是将
生日设置为索引并重新采样:

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()
输出:

生日
2015-12-01    12
2016-01-01    31
2016-02-01    29
2016-03-01     1
频率:MS,数据类型:int64
您也可以将“每月”期间与
dt
存取器一起使用:

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是您可以使用的索引(而不是列):


截至2019年4月:这将起作用。熊猫版本-0.24.x


df.groupby([df.dates.dt.year.rename('year')、df.dates.dt.month.rename('month'))).size()

用各自的列名替换日期和计数字段。这段代码将根据给定的参数进行分组、求和和和排序。您还可以将频率更改为1米或2米,以此类推

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

嗨@EdChum-恢复Monica的身份我如何绘制这些数据?@AdamIqshan抱歉,你应该问一个新问题,而不是使用评论
df[['date', 'count']].groupby(pd.Grouper(key='date', freq='1M')).sum().sort_values(by='date', ascending=True)['count']