У меня есть DataFrame, подобный следующему:
date | type | column1
----------------------------
2019-01-01 | A | 1
2019-02-01 | A | 1
2019-03-01 | A | 1
2019-04-01 | A | 0
2019-05-01 | A | 1
2019-06-01 | A | 1
2019-07-01 | B | 1
2019-08-01 | B | 1
2019-09-01 | B | 0
Я хочу иметь столбец с именем "streak", имеющий полосу, но сгруппированный по столбцу "type":
date | type | column1 | streak
-------------------------------------
2019-01-01 | A | 1 | 1
2019-02-01 | A | 1 | 2
2019-03-01 | A | 1 | 3
2019-04-01 | A | 0 | 0
2019-05-01 | A | 1 | 1
2019-06-01 | A | 1 | 2
2019-07-01 | B | 1 | 1
2019-08-01 | B | 1 | 2
2019-09-01 | B | 0 | 0
Мне удалось сделать это следующим образом:
def streak(df):
grouper = (df.column1 != df.column1.shift(1)).cumsum()
df['streak'] = df.groupby(grouper).cumsum()['column1']
return df
df = df.groupby(['type']).apply(streak)
Но мне интересно, возможно ли сделать это встроенным без использования группировки и применения, потому что мой DataFrame содержит около 100 миллионов строк, и это занимает несколько часов, чтобыпроцесс.
Любые идеи о том, как оптимизировать это для скорости?