Рассчитать накопленную сумму, в то время как значение другого столбца остается прежним
Для следующих df
Я хочу рассчитать совокупную сумму столбца Inst_Dist
и сохранить как Cumu_Dist
в то время как значение WDir_Deg
остается такой же. Когда значение в WDir_Deg
изменения, мне нужно перезапустить накопленную сумму.
Следовательно,
index | WDir_Deg | Inst_Dist | Cumu_Dist
0 | 289 | 20 | NaN
1 | 285 | 17 | NaN
2 | 285 | 19 | NaN
3 | 287 | 19 | NaN
4 | 289 | 10 | NaN
становится
index | WDir_Deg | Inst_Dist | Cumu_Dist
0 | 289 | 20 | 20
1 | 285 | 17 | 17
2 | 285 | 19 | 36
3 | 287 | 19 | 19
4 | 289 | 10 | 10
Мой неидиоматичный (чрезвычайно медленный) код Python приведен ниже. Я был бы очень признателен, если бы кто-нибудь смог мне подсказать, как сделать код быстрее и понятнее.
prev_angle = -1
curr_cumu_dist = 0
for curr_ind in df.index:
curr_angle = df.loc[curr_ind, 'WDir_Deg']
if prev_angle == curr_angle:
curr_cumu_dist += df.loc[curr_ind, 'Inst_Dist']
df.loc[curr_ind, 'Cumu_Dist'] = curr_cumu_dist
else:
prev_angle = curr_angle
curr_cumu_dist = df.loc[curr_ind, 'Inst_Dist']
df.loc[curr_ind, 'Cumu_Dist'] = curr_cumu_dist
2 ответа
Использовать помощник Series
с сравнить WDir_Deg
столбец для не равно ne
, shift
а также cumsum
для последовательных групп и передать его DataFrameGroupBy.cumsum
:
s = df['WDir_Deg'].ne(df['WDir_Deg'].shift()).cumsum()
df['Cumu_Dist'] = df.groupby(s)['Inst_Dist'].cumsum()
print (df)
WDir_Deg Inst_Dist Cumu_Dist
0 289 20 20
1 285 17 17
2 285 19 36
3 287 19 19
4 289 10 10
Деталь:
print (s)
0 1
1 2
2 2
3 3
4 4
Name: WDir_Deg, dtype: int32
Вид хитрый. Ссылка на этот вопрос / ответы Pandas groupby накопленная сумма
Я сделал это решение
df['Cumu_Dist'] = df.groupby('WDir_Deg').Inst_Dist.cumsum()
Который возвращается
index WDir_Deg Inst_Dist Cumu_Dist
0 0 285 17 17
1 1 285 19 36
2 2 287 19 19
3 3 289 20 20
Это использует pandas
версия 0.23.4