厚着脸皮,再写一篇~~~
需求描述:
如下列数据,第一列是id,第二列标识的是状态,但状态变化时,我需要统计出来保持该状态的其他列的一些数据如开始、结束时间,sum等等。虽然只有1020和1021两种状态,但是从1020变化到1021,这是一次变化,从1021变到1020这是第二次变化,所以要标识3种状态。假如直接按照这一列进行groupby,那么其他列的统计信息比如sum、mean等就会有问题,因为它把首尾两部分的“1020”会groupby到一起。总之,我要的效果是通过某种方式可以将 id=0到26的数据groupby到一起,id=27到某一行(状态是1021的数据)groupby到一起,之后的数据再独自groupby到一起。
0 1020
1 1020
2 1020
3 1020
4 1020
5 1020
6 1020
7 1020
8 1020
9 1020
10 1020
11 1020
12 1020
13 1020
14 1020
15 1020
16 1020
17 1020
18 1020
19 1020
20 1020
21 1020
22 1020
23 1020
24 1020
25 1020
26 1020
27 1021
28 1021
29 1021
...
66 1020
67 1020
68 1020
69 1020
70 1020
71 1020
72 1020
73 1020
74 1020
75 1020
76 1020
77 1020
78 1020
79 1020
80 1020
81 1020
82 1020
83 1020
84 1020
85 1020
86 1020
87 1020
88 1020
89 1020
90 1020
91 1020
92 1020
93 1020
94 1020
95 1020
Name: status_summary, Length: 96, dtype: int64
学艺不精,在网上找到了一种优雅的方式:
testdf["status_summary"].diff().ne(0).cumsum()
diff()是计算相邻两条数据的差,ne(0)判断是否为0,不等于0则输出“True“,否则是”False“,cumsum()是累加,结果如下
0 1
1 1
2 1
3 1
4 1
5 1
6 1
7 1
8 1
9 1
10 1
11 1
12 1
13 1
14 1
15 1
16 1
17 1
18 1
19 1
20 1
21 1
22 1
23 1
24 1
25 1
26 1
27 2
28 2
29 2
..
66 3
67 3
68 3
69 3
70 3
71 3
72 3
73 3
74 3
75 3
76 3
77 3
78 3
79 3
80 3
81 3
82 3
83 3
84 3
85 3
86 3
87 3
88 3
89 3
90 3
91 3
92 3
93 3
94 3
95 3
Name: status_summary, Length: 96, dtype: int32
这样就生成了一个新列,标识出状态变化后的数据,然后根据这一列来grouby,问题搞定。