如何使用Groupby按时间频率计数-熊猫

时间:2019-10-10 10:30:29

标签: python pandas pandas-groupby

我正尝试使用df中的2列按月统计2次事件的发生率。到目前为止,我所做的工作已经按照唯一的时间对所有事件进行了计数,由于结果太多,效率不够高。我希望以后再创建一个图形。

我已经尝试通过SO问题的答案来修改我的代码:

但是当我在freq='day'命令中输入groupby时似乎无法使该命令正常工作。

我的代码是:

print(df.groupby(['Priority', 'Create Time']).Priority.count())

最初产生约170000的结果,结果如下:

Priority  Create Time        
1.0       2011-01-01 00:00:00    1
          2011-01-01 00:01:11    1
          2011-01-01 00:02:10    1
                  ...

2.0       2011-01-01 00:01:25    1
          2011-01-01 00:01:35    1
                  ...

但是现在由于某种原因(我正在使用Jupyter Notebook),它只会生成:

Priority  Create Time        
1.0       2011-01-01 00:00:00    1
          2011-01-01 00:01:11    1
          2011-01-01 00:02:10    1
2.0       2011-01-01 00:01:25    1
          2011-01-01 00:01:35    1
Name: Priority, dtype: int64

不知道为什么输出只更改为5个结果(也许我在不知不觉中更改了某些内容)。

我希望结果采用以下格式:

Priority  month     Count     
1.0       2011-01     a
          2011-02     b
          2011-03     c
                ...

2.0       2011-01     x
          2011-02     y
          2011-03     z
                ...

用于显示如何正确更改其他值(例如hour/day/month/year)的频率的最高点。有了答案,您能否解释一下我是新来的和正在学习熊猫的代码中正在发生的事情,并希望了解该过程。谢谢。

1 个答案:

答案 0 :(得分:2)

一种可能的解决方案是通过Series.dt.to_period将datetime列转换为月周期:

print(df.groupby(['Priority', df['Create Time'].dt.to_period('m')]).Priority.count())

或使用Grouper

print(df.groupby(['Priority', pd.Grouper(key='Create Time', freq='MS')]).Priority.count())

示例

np.random.seed(123)

df = pd.DataFrame({'Create Time':pd.date_range('2019-01-01', freq='10D', periods=10),
                   'Priority':np.random.choice([0,1], size=10)})

print (df)
  Create Time  Priority
0  2019-01-01         0
1  2019-01-11         1
2  2019-01-21         0
3  2019-01-31         0
4  2019-02-10         0
5  2019-02-20         0
6  2019-03-02         0
7  2019-03-12         1
8  2019-03-22         1
9  2019-04-01         0

print(df.groupby(['Priority', df['Create Time'].dt.to_period('m')]).Priority.count())
Priority  Create Time
0         2019-01        3
          2019-02        2
          2019-03        1
          2019-04        1
1         2019-01        1
          2019-03        2
Name: Priority, dtype: int64

print(df.groupby(['Priority', pd.Grouper(key='Create Time', freq='MS')]).Priority.count())
Priority  Create Time
0         2019-01-01     3
          2019-02-01     2
          2019-03-01     1
          2019-04-01     1
1         2019-01-01     1
          2019-03-01     2
Name: Priority, dtype: int64