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

2024-04-30 05:59:55 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

stackoverflow中的其他问题指向一个名为TimeGrouper的Grouper,但是在pandas文档中搜索时什么也没有找到。知道吗?


Tags: 数据pandasdfcount图表策略出生日期birthdate
3条回答

您还可以使用带有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是可以使用的索引(而不是列),则可以使用^{}

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

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

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

更新

从版本^{}开始,由于多索引级别名称必须唯一的限制,上述代码不再工作,现在需要rename级别才能工作:

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

另一种解决方案是将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

相关问题 更多 >