根据Pandas中的日期范围计算定性值

时间:2014-08-15 04:42:37

标签: python pandas data-analysis

我正在学习使用Pandas库,需要执行分析并绘制下面的犯罪数据集。每一行代表一次犯罪。 date_rep列包含一年的每日日期。

enter image description here

数据需要按月分组,特定犯罪的实例需要每月累计,如下表所示。

enter image description here

我遇到的问题是犯罪列中的数据是定性的,我只是无法在线找到可以帮助我解决此问题的资源!

我一直在阅读groupby和不同的排序方法,但实现这一目标的最有效方法是什么?提前谢谢!

1 个答案:

答案 0 :(得分: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

但是,您希望每个月分别执行此操作。要按月分组,您可以使用pd.Grouper内的groupby来指定月份:

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