generate an id, which fulfills a cycle sequence of another column
Question:
I have the following DataFrame:
*) id: activity identifier
*) cycle: shows the activity of each cycle, following the following sequence 1,2,3,4,5,6 (Starts at 1 and ends at 6)
*) team: team name
GET THE NEW ID
id_nuevo: id that mentions the cycle, in case the sequence is not fulfilled
id
ciclo
equipo
id_nuevo
1428171
3
Eq01
null
1427533
4
Eq01
null
1427950
5
Eq01
null
1427956
6
Eq01
null
1427957
1
Eq01
1
1427960
2
Eq01
1
1427913
3
Eq01
1
1430050
4
Eq01
1
1431974
5
Eq01
1
1431534
6
Eq01
1
1428030
1
Eq01
null
1428031
2
Eq01
null
1427930
3
Eq01
null
1427601
1
Eq01
2
1427578
2
Eq01
2
1427927
3
Eq01
2
1427532
4
Eq01
2
1427977
5
Eq01
2
1427980
6
Eq01
2
1433246
3
Eq01
null
1433251
4
Eq01
null
1427585
1
Eq01
3
1427974
2
Eq01
3
1427910
3
Eq01
3
1430905
4
Eq01
3
1431681
5
Eq01
3
1432176
6
Eq01
3
1433005
1
Eq01
null
1434616
2
Eq01
null
1433245
4
Eq01
null
So far I have not been successful, I hope someone can help me
Answers:
You can use:
import numpy as np
ref = [1, 2, 3, 4, 5, 6]
# get first row of each stretch
m1 = df['ciclo'].diff().ne(1)
# form groups
group = m1.cumsum()
# identify groups equal to ref
m2 = (df.groupby([group, 'equipo'])['ciclo']
.transform(lambda s: np.array_equal(s, ref))
)
# increment count
df['id_nuevo'] = (m1&m2).cumsum().where(m2)
Output:
id ciclo equipo id_nuevo
0 1428171 3 Eq01 NaN
1 1427533 4 Eq01 NaN
2 1427950 5 Eq01 NaN
3 1427956 6 Eq01 NaN
4 1427957 1 Eq01 1.0
5 1427960 2 Eq01 1.0
6 1427913 3 Eq01 1.0
7 1430050 4 Eq01 1.0
8 1431974 5 Eq01 1.0
9 1431534 6 Eq01 1.0
10 1428030 1 Eq01 NaN
11 1428031 2 Eq01 NaN
12 1427930 3 Eq01 NaN
13 1427601 1 Eq01 2.0
14 1427578 2 Eq01 2.0
15 1427927 3 Eq01 2.0
16 1427532 4 Eq01 2.0
17 1427977 5 Eq01 2.0
18 1427980 6 Eq01 2.0
19 1433246 3 Eq01 NaN
20 1433251 4 Eq01 NaN
21 1427585 1 Eq01 3.0
22 1427974 2 Eq01 3.0
23 1427910 3 Eq01 3.0
24 1430905 4 Eq01 3.0
25 1431681 5 Eq01 3.0
26 1432176 6 Eq01 3.0
27 1433005 1 Eq01 NaN
28 1434616 2 Eq01 NaN
29 1433245 4 Eq01 NaN
Intermediates:
id ciclo equipo m1 group m2 m1&m2 (m1&m2).cumsum() id_nuevo
0 1428171 3 Eq01 True 1 False False 0 NaN
1 1427533 4 Eq01 False 1 False False 0 NaN
2 1427950 5 Eq01 False 1 False False 0 NaN
3 1427956 6 Eq01 False 1 False False 0 NaN
4 1427957 1 Eq01 True 2 True True 1 1.0
5 1427960 2 Eq01 False 2 True False 1 1.0
6 1427913 3 Eq01 False 2 True False 1 1.0
7 1430050 4 Eq01 False 2 True False 1 1.0
8 1431974 5 Eq01 False 2 True False 1 1.0
9 1431534 6 Eq01 False 2 True False 1 1.0
10 1428030 1 Eq01 True 3 False False 1 NaN
11 1428031 2 Eq01 False 3 False False 1 NaN
12 1427930 3 Eq01 False 3 False False 1 NaN
13 1427601 1 Eq01 True 4 True True 2 2.0
14 1427578 2 Eq01 False 4 True False 2 2.0
15 1427927 3 Eq01 False 4 True False 2 2.0
16 1427532 4 Eq01 False 4 True False 2 2.0
17 1427977 5 Eq01 False 4 True False 2 2.0
18 1427980 6 Eq01 False 4 True False 2 2.0
19 1433246 3 Eq01 True 5 False False 2 NaN
20 1433251 4 Eq01 False 5 False False 2 NaN
21 1427585 1 Eq01 True 6 True True 3 3.0
22 1427974 2 Eq01 False 6 True False 3 3.0
23 1427910 3 Eq01 False 6 True False 3 3.0
24 1430905 4 Eq01 False 6 True False 3 3.0
25 1431681 5 Eq01 False 6 True False 3 3.0
26 1432176 6 Eq01 False 6 True False 3 3.0
27 1433005 1 Eq01 True 7 False False 3 NaN
28 1434616 2 Eq01 False 7 False False 3 NaN
29 1433245 4 Eq01 True 8 False False 3 NaN
I have the following DataFrame:
*) id: activity identifier
*) cycle: shows the activity of each cycle, following the following sequence 1,2,3,4,5,6 (Starts at 1 and ends at 6)
*) team: team name
GET THE NEW ID
id_nuevo: id that mentions the cycle, in case the sequence is not fulfilled
id | ciclo | equipo | id_nuevo |
---|---|---|---|
1428171 | 3 | Eq01 | null |
1427533 | 4 | Eq01 | null |
1427950 | 5 | Eq01 | null |
1427956 | 6 | Eq01 | null |
1427957 | 1 | Eq01 | 1 |
1427960 | 2 | Eq01 | 1 |
1427913 | 3 | Eq01 | 1 |
1430050 | 4 | Eq01 | 1 |
1431974 | 5 | Eq01 | 1 |
1431534 | 6 | Eq01 | 1 |
1428030 | 1 | Eq01 | null |
1428031 | 2 | Eq01 | null |
1427930 | 3 | Eq01 | null |
1427601 | 1 | Eq01 | 2 |
1427578 | 2 | Eq01 | 2 |
1427927 | 3 | Eq01 | 2 |
1427532 | 4 | Eq01 | 2 |
1427977 | 5 | Eq01 | 2 |
1427980 | 6 | Eq01 | 2 |
1433246 | 3 | Eq01 | null |
1433251 | 4 | Eq01 | null |
1427585 | 1 | Eq01 | 3 |
1427974 | 2 | Eq01 | 3 |
1427910 | 3 | Eq01 | 3 |
1430905 | 4 | Eq01 | 3 |
1431681 | 5 | Eq01 | 3 |
1432176 | 6 | Eq01 | 3 |
1433005 | 1 | Eq01 | null |
1434616 | 2 | Eq01 | null |
1433245 | 4 | Eq01 | null |
So far I have not been successful, I hope someone can help me
You can use:
import numpy as np
ref = [1, 2, 3, 4, 5, 6]
# get first row of each stretch
m1 = df['ciclo'].diff().ne(1)
# form groups
group = m1.cumsum()
# identify groups equal to ref
m2 = (df.groupby([group, 'equipo'])['ciclo']
.transform(lambda s: np.array_equal(s, ref))
)
# increment count
df['id_nuevo'] = (m1&m2).cumsum().where(m2)
Output:
id ciclo equipo id_nuevo
0 1428171 3 Eq01 NaN
1 1427533 4 Eq01 NaN
2 1427950 5 Eq01 NaN
3 1427956 6 Eq01 NaN
4 1427957 1 Eq01 1.0
5 1427960 2 Eq01 1.0
6 1427913 3 Eq01 1.0
7 1430050 4 Eq01 1.0
8 1431974 5 Eq01 1.0
9 1431534 6 Eq01 1.0
10 1428030 1 Eq01 NaN
11 1428031 2 Eq01 NaN
12 1427930 3 Eq01 NaN
13 1427601 1 Eq01 2.0
14 1427578 2 Eq01 2.0
15 1427927 3 Eq01 2.0
16 1427532 4 Eq01 2.0
17 1427977 5 Eq01 2.0
18 1427980 6 Eq01 2.0
19 1433246 3 Eq01 NaN
20 1433251 4 Eq01 NaN
21 1427585 1 Eq01 3.0
22 1427974 2 Eq01 3.0
23 1427910 3 Eq01 3.0
24 1430905 4 Eq01 3.0
25 1431681 5 Eq01 3.0
26 1432176 6 Eq01 3.0
27 1433005 1 Eq01 NaN
28 1434616 2 Eq01 NaN
29 1433245 4 Eq01 NaN
Intermediates:
id ciclo equipo m1 group m2 m1&m2 (m1&m2).cumsum() id_nuevo
0 1428171 3 Eq01 True 1 False False 0 NaN
1 1427533 4 Eq01 False 1 False False 0 NaN
2 1427950 5 Eq01 False 1 False False 0 NaN
3 1427956 6 Eq01 False 1 False False 0 NaN
4 1427957 1 Eq01 True 2 True True 1 1.0
5 1427960 2 Eq01 False 2 True False 1 1.0
6 1427913 3 Eq01 False 2 True False 1 1.0
7 1430050 4 Eq01 False 2 True False 1 1.0
8 1431974 5 Eq01 False 2 True False 1 1.0
9 1431534 6 Eq01 False 2 True False 1 1.0
10 1428030 1 Eq01 True 3 False False 1 NaN
11 1428031 2 Eq01 False 3 False False 1 NaN
12 1427930 3 Eq01 False 3 False False 1 NaN
13 1427601 1 Eq01 True 4 True True 2 2.0
14 1427578 2 Eq01 False 4 True False 2 2.0
15 1427927 3 Eq01 False 4 True False 2 2.0
16 1427532 4 Eq01 False 4 True False 2 2.0
17 1427977 5 Eq01 False 4 True False 2 2.0
18 1427980 6 Eq01 False 4 True False 2 2.0
19 1433246 3 Eq01 True 5 False False 2 NaN
20 1433251 4 Eq01 False 5 False False 2 NaN
21 1427585 1 Eq01 True 6 True True 3 3.0
22 1427974 2 Eq01 False 6 True False 3 3.0
23 1427910 3 Eq01 False 6 True False 3 3.0
24 1430905 4 Eq01 False 6 True False 3 3.0
25 1431681 5 Eq01 False 6 True False 3 3.0
26 1432176 6 Eq01 False 6 True False 3 3.0
27 1433005 1 Eq01 True 7 False False 3 NaN
28 1434616 2 Eq01 False 7 False False 3 NaN
29 1433245 4 Eq01 True 8 False False 3 NaN