在Pandas中根据日期范围计数定性值

1 投票
1 回答
2833 浏览
提问于 2025-04-18 17:22

我正在学习使用Pandas库,想对下面的犯罪数据集进行分析和绘图。每一行代表一次犯罪事件。date_rep这一列包含了一整年的每日日期。

enter image description here

数据需要按月份进行分组,并且每个月特定类型的犯罪事件需要进行汇总,就像下面的表格那样。

enter image description here

我遇到的问题是,犯罪这一列的数据是定性的,我在网上找不到能帮助我解决这个问题的资源!

我一直在学习groupby和不同的排序方法,但实现这个目标的最有效方法是什么呢?非常感谢!

1 个回答

3

要复制你数据中的某些内容:

In [29]: df = pd.DataFrame({'date_rep':pd.date_range('2012-01-01', periods=100),
    ...:                    'crm_cd_desc':np.random.choice(['robbery', 'traffic', 'assault'], size=100)})


In [30]: df.head()
Out[30]: 
  crm_cd_desc   date_rep
0     traffic 2012-01-01
1     traffic 2012-01-02
2     assault 2012-01-03
3     robbery 2012-01-04

其实,你想做的就是统计每个值出现的次数

In [31]: df['crm_cd_desc'].value_counts()
Out[31]: 
assault    36
traffic    34
robbery    30
dtype: int64

不过,你想要的是按每个月分别来统计。为了按月份分组,你可以在groupby里使用pd.Grouper来指定月份:

In [34]: df.groupby(pd.Grouper(key='date_rep', freq='M'))['crm_cd_desc'].value_counts()
Out[34]: 
date_rep           
2012-01-31  traffic    12
            robbery    10
            assault     9
2012-02-29  assault    13
            traffic    11
            robbery     5
2012-03-31  assault    12
            robbery    10
            traffic     9
2012-04-30  robbery     5
            assault     2
            traffic     2
dtype: int64

然后用unstack来得到结果:

In [35]: df.groupby(pd.Grouper(key='date_rep', freq='M'))['crm_cd_desc'].value_counts().unstack()
Out[35]: 
            assault  robbery  traffic
date_rep                             
2012-01-31        9       10       12
2012-02-29       13        5       11
2012-03-31       12       10        9
2012-04-30        2        5        2

除了使用value_counts,你也可以同时按月份和犯罪类型分组,然后计算每个组的数量:

In [46]: df.groupby([pd.Grouper(key='date_rep', freq='M'), 'crm_cd_desc']).size().unstack()
Out[46]: 
crm_cd_desc  assault  robbery  traffic
date_rep                              
2012-01-31        9       10       12
2012-02-29       13        5       11
2012-03-31       12       10        9
2012-04-30        2        5        2

撰写回答