Я пытаюсь создать счетчик, который накапливает полосы, но может быть отменен другим столбцом. Есть три результата в этом подсчете
- Полоса накапливается на основе флага == true.
- Полоса сбрасывается при отмене при отмене == true.
- Полоса ничего не делает и повторяет текущую полосу.
Я пробовал несколько разных подходов, пытаясь объединить флаг и отменить с помощью np.where, маскируя groupby с помощью where, нескольких cumsums, fill и ngroup, но не могу получить требуемый результат.
df = pd.DataFrame(
{
"cond1": [True, False, True, False, True, False, True],
"cond2": [False, False, False, True, False, False, False]
})
df['flag'] = np.where(df['cond1'], 1, 0)
df['cancel'] = np.where(df['cond2'], 1, 0)
# Combined
df['combined'] = df['flag'] - df['cancel']
# Cumsum only
df['cumsum'] = df['combined'].cumsum()
# Cumcount masked by where
df['cumsum_cumcount'] = df.where(df['cond1']).groupby((df['cond2']).cumsum()).cumcount()
# Cumcount then cumsum
df['cumsum_cumcount_cumsum'] = df.where(df['cancel'] == False).groupby(df['flag'].cumsum()).cumcount().cumsum()
cond1 cond2 flag cancel c2 c3 c1
0 True False 1 0 0 0 1
1 False False 0 0 1 1 1
2 True False 1 0 2 1 2
3 False True 0 1 0 2 1
4 True False 1 0 1 2 2
5 False False 0 0 2 3 2
6 True False 1 0 3 3 3
cond1 cond2 streak
0 True False 1
1 False False 1
2 True False 2
3 False True 0
4 True False 1
5 False False 1
6 True False 2
7 True False 3
8 False False 3
9 True False 4
10 False True 0
11 False False 0
12 True False 1
Текущая полоса повторяется, накапливается, когда cond1 имеет значение true, и сбрасывается, когда cond2 имеет значение false. Большие бонусные очки, если это может накапливаться в противоположном направлении тоже без особых хлопот. Отменяет быть отрицательным, флажки - положительным.