time data
2018-05-01 00:00:00.650 57
2018-05-01 00:00:01.990 54
2018-05-01 00:00:09.487 73
2018-05-01 00:00:14.607 95
2018-05-01 00:00:16.350 77
2018-05-01 00:00:16.397 28
2018-05-01 00:00:16.563 54
2018-05-01 00:00:25.457 19
2018-05-01 00:00:31.140 09
2018-05-01 00:00:54.427 18
2018-05-01 00:00:55.387 39
2018-05-01 00:01:02.193 97
2018-05-01 00:01:07.447 39
2018-05-01 00:01:09.020 41
2018-05-01 00:01:11.033 93
2018-05-01 00:01:25.693 42
2018-05-01 00:02:03.900 42
2018-05-01 00:02:04.190 84
2018-05-01 00:02:05.727 39
2018-05-01 00:02:10.910 40
现在有一个df的数据如上所示 ↑↑↑
现在要按照日期和小时进行分组,此时可以先将time列设置为索引,
df.set_index("time", inpalce=True)
inplace参数是表示在原数据框上修改,此时的df的time列就已经变成了索引,可以使用df.index进行验证。这里就不细说了。
至于为什么要把事件列设置为索引,是因为后面要根据日期和小时进行分组,这样取值更方便。接下来就会用到。
使用pandas的groupby函数进行分组:
dp = df.groupby([lambda x:x.day, lambda x:x.hour, "data"])
此时的dp是一个GroupBy对象,没有进行任何计算,不过已经具备了接下来对各分组执行运算所需要的一切信息。后面可以接GroupBy的计算方法,比如:sum(), meam(), size(),agg()等等。
为了进行下一步,我们在上面的一行代码后面加一个size()方法。
dp = df.groupby([lambda x:x.day, lambda x:x.hour, "data"]).size()
此时的dp经过计算可以进行显示了。如下所示↓↓↓
data
1 0 18 1
19 2
28 1
39 3
40 1
41 1
42 2
54 2
57 1
73 1
77 1
84 1
93 1
95 1
97 1
dtype: int64
下面给最后一列统计的次数一个列明,进行保存:
new_dp = dp.reset_index(name="times")
new_dp是新生成的一个DataFrame:
level_0 level_1 data times
0 1 0 18 1
1 1 0 19 2
2 1 0 28 1
3 1 0 39 3
4 1 0 40 1
5 1 0 41 1
6 1 0 42 2
7 1 0 54 2
8 1 0 57 1
9 1 0 73 1
10 1 0 77 1
11 1 0 84 1
12 1 0 93 1
13 1 0 95 1
14 1 0 97 1
level_0标签是日期,也就是5月1号的1号;
level_1列就是小时了,因为每天是从0点开始的,所以就是0;
data列是原来df的data列数据,只不过也进行了分组处理;
times列是将data列分组后,每小时内出现的次数。