在Pandas中根据日期范围计数定性值
我正在学习使用Pandas库,想对下面的犯罪数据集进行分析和绘图。每一行代表一次犯罪事件。date_rep这一列包含了一整年的每日日期。
数据需要按月份进行分组,并且每个月特定类型的犯罪事件需要进行汇总,就像下面的表格那样。
我遇到的问题是,犯罪这一列的数据是定性的,我在网上找不到能帮助我解决这个问题的资源!
我一直在学习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