Рассчитать накопленную сумму, в то время как значение другого столбца остается прежним - PullRequest
0 голосов
/ 27 февраля 2019

Для следующих 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 ]

0 голосов
/ 27 февраля 2019

Используйте помощник 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
0 голосов
/ 27 февраля 2019

Вид хитрый.Ссылка на этот вопрос / ответы 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

...