首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用Pandas按月和年对行进行分组和计数?

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

Stack Overflow用户
提问于 2016-08-05 14:49:47
回答 5查看 91.3K关注 0票数 40

我有一个数据集的个人资料,如姓名,身高,体重和出生日期。我会用出生在特定月份和年份的人的数量来构建一个图表。我用巨蟒熊猫来完成这个任务,我的策略是尝试按年和月分组,并添加使用计数。但我得到的最接近的是按年或按月统计的人数,而不是两者都计算。

代码语言:javascript
复制
df['birthdate'].groupby(df.birthdate.dt.year).agg('count')

堆栈溢出中的其他问题指向了一只名为TimeGrouper的石斑鱼,但在熊猫文档中搜索却一无所获。有什么想法吗?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2016-08-05 14:52:27

若要对多个标准进行分组,请传递列或标准的列表:

代码语言:javascript
复制
df['birthdate'].groupby([df.birthdate.dt.year, df.birthdate.dt.month]).agg('count')

示例:

代码语言:javascript
复制
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级别以使其工作:

代码语言:javascript
复制
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
票数 70
EN

Stack Overflow用户

发布于 2017-10-07 20:10:53

您还可以在to_period中与dt访问器一起使用“每月”期:

代码语言:javascript
复制
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

代码语言:javascript
复制
df.resample("M").count()
票数 32
EN

Stack Overflow用户

发布于 2016-08-05 15:06:04

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

代码语言:javascript
复制
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()

输出:

代码语言:javascript
复制
birthdate
2015-12-01    12
2016-01-01    31
2016-02-01    29
2016-03-01     1
Freq: MS, dtype: int64
票数 14
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38792122

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档