Вот одна попытка, необходимо проверить больше данных:
t_num = ((df['Value'].shift() < df.groupby(['Day',df.groupby('Day')['Journey'].cummax()])['Value'].transform('first')) | df['Day'].diff().bfill().ne(0)).cumsum() + 1
m = t_num.diff().bfill().eq(1) & df.Journey.eq(0)
t_num = t_num.mask(m,0)
df['JGroup'] = t_num
df
Вывод:
Day Journey InitialValue Value JourneyGroup JGroup
0 12 1 3.0 4 1 1
1 12 1 4.0 5 1 1
2 12 0 NaN 7 1 1
3 12 0 NaN 2 1 1
4 12 1 5.0 8 2 2
5 12 0 NaN 9 2 2
6 13 1 3.0 4 3 3
7 13 1 4.0 5 3 3
8 13 0 NaN 7 3 3
9 13 0 NaN 6 3 3
10 13 1 1.0 2 3 3
11 13 0 NaN 9 0 0
Объяснение:
Групповой день и найти началопоездки и задайте все дни в этом дне, как в «Путешествии», так как мы не уверены, когда поездка останавливается:
df.groupby('Day')['Journey'].cummax()
Далее, используйте это в новой группе, чтобы найти первое значение в началеотключите и скопируйте его по длине групп, используя преобразование.
df.groupby(['Day',df.groupby('Day')['Journey'].cummax()])['Value'].transform('first')
Используйте, сдвиг, чтобы сравнить со следующей записью.Если сравнение меньше чем, возвращаемое True или изменение даты возвращают True, это указывает на конец старого путешествия и начало нового.Используйте cumsum
для увеличения счетчика.
Затем, используя этот индекс количества, необходимо замаскировать запись, которая начинает новую группу с поездкой = 0.
m = t_num.diff().bfill().eq(1) & df.Journey.eq(0)
t_num = t_num.mask(m,0)
Это действительно простоНачните.Я не чувствую, что этот код достаточно надежен, чтобы передать другой набор данных.