Ниже приведен фрейм данных, который у меня есть
ColA ColB Time ColC
A B 01-01-2022 ABC
A B 02-01-2022 ABC
A B 07-01-2022 XYZ
A B 11-01-2022 IJK
A B 14-01-2022 ABC
Желаемый результат:
ColA ColB Time ColC groupID
A B 01-01-2022 ABC 1
A B 02-01-2022 ABC 1
A B 07-01-2022 XYZ 2
A B 11-01-2022 IJK 3
A B 14-01-2022 ABC 4
ОБНОВЛЕНО: Ниже приведен код, выполняемый после cumsum
df['ColC'] = df['ColC'].ne(df['ColC'].shift(1)).groupby([df['ColA'],
df['ColB']]).cumsum()
ColA ColB Time ColC groupID
A B 01-01-2022 ABC 1
A B 02-01-2022 ABC 1
A B 07-01-2022 XYZ 2
A B 11-01-2022 XYZ 3
A B 14-01-2022 XYZ 4
A B 14-01-2022 XYZ 4
заранее спасибо
Логика не совсем ясна, но похоже, что вы пытаетесь сгруппировать по номеру недели (и ColC):
df['groupID'] = (df
.groupby([pd.to_datetime(df['Time'], dayfirst=True).dt.isocalendar().week,
'ColC'], sort=False)
.ngroup().add(1)
)
выход:
ColA ColB Time ColC groupID
0 A B 01-01-2022 ABC 1
1 A B 02-01-2022 ABC 1
2 A B 07-01-2022 XYZ 2
3 A B 11-01-2022 IJK 3
4 A B 14-01-2022 ABC 4
Хорошо, тогда простой df['groupID'] = df['ColC'].ne(df['ColC'].shift()).cumsum()
должен работать. Почему в заголовке написано "по дате и времени"?
Я также хотел сгруппировать по ColA и ColB. Извините, что ввела в заблуждение вопросом
ne
означает «не равно». Тогда df['groupID'] = df['ColC'].ne(df['ColC'].shift()).groupby([df['ColA'], df['ColB']]).cumsum()
на самом деле это решение не работает. Я отредактирую пост с обновленной таблицей после выполнения
вам лучше улучшить свой пример, чтобы включить другую группу (группы) и четко объяснить логику;)
Моя цель - обнаружить изменение значения на основе предыдущей строки и соответствующим образом назначить идентификатор группы. Если ColC - это что-то вроде этого A, A, A, A, B, B, A, тогда мой groupid будет 1,1,1,1,2,2,3 ... значение 2 пришло, потому что A меняется на B и значение 3 потому что B меняется на A.
Что ж, на самом деле это вариант того, что я описал выше, но детали, которые вам нужны, слишком неясны, чтобы дать вам точный код.
Извиняюсь. Работает. Мне тоже нужно сгруппироваться по ближайшей смене. df['groupID'] = df['ColC'].ne(df.groupby(['ColA[,'ColB'])[ColC'].shift()).groupby([df['ColA' ], df['ColB']]).cumsum()
Привет @mozway Спасибо за ваш ответ. Я не пытаюсь группировать по неделям. Я пытаюсь назначить идентификатор группы всякий раз, когда происходит изменение ColC по сравнению с предыдущей строкой. Например, индексам 0,1 присваивается groupID 1, потому что ABC повторяется в этой последовательности. Внезапное изменение XYZ увеличивает идентификатор группы на 1. Еще одно новое появление ABC — это отдельный идентификатор группы (индекс 4).