如何使用Pandas按月和年分组和计算行数?

时间:2016-08-05 14:49:48

标签: python pandas

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

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

stackoverflow中的其他问题指向名为TimeGrouper的Grouper,但在pandas文档中搜索没有发现任何内容。有什么想法吗?

5 个答案:

答案 0 :(得分:23)

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

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开始,上述代码由于多索引级别名称必须唯一的限制而不再有效,您现在需要rename级别才能使其生效:< / p>

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

答案 1 :(得分:11)

您还可以将to_perioddt访问者一起使用“每月”期间:

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

值得注意的是,日期时间是否可以使用resample的索引(而不是列):

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

答案 2 :(得分:8)

另一种解决方案是将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 :(得分:0)

从2019年4月开始:这将起作用。熊猫版-0.24.x

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

答案 4 :(得分:0)

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

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