Сумма вдоль столбца панды, обусловленная значением Мультииндекса?



У меня есть следующий фрейм данных Pandas df:



                                 Value
time Position
1493791210867023000 0.0 21156.0
1.0 1230225.0
2.0 1628088.0
3.0 2582359.0
4.0 3388164.0
1493791210880251000 0.0 21156.0
1.0 1230225.0
2.0 1628088.0
3.0 2582359.0
4.0 3388164.0
1493791210888418000 0.0 21156.0
1.0 1230225.0
... ... ...


Как я могу эффективно суммировать по индексу "позиция"?
Точная формула суммирования, которую я пытаюсь реализовать, такова:



                                 Value        Result
time Position
1493791210867023000 0.0 21156.0 Sum from 0.0 to 0.0
1.0 1230225.0 Sum from 0.0 to 1.0
2.0 1628088.0 Sum from 0.0 to 2.0
3.0 2582359.0 Sum from 0.0 to 3.0
4.0 3388164.0 Sum from 0.0 to 4.0
1493791210880251000 0.0 21156.0 Sum from 0.0 to 0.0
1.0 1230225.0 Sum from 0.0 to 1.0
2.0 1628088.0 Sum from 0.0 to 2.0
3.0 2582359.0 Sum from 0.0 to 3.0
... ... ... ...


Мое текущее решение занимает слишком много времени (IndexSlice болезненно медленный), и я не совсем уверен, как я мог бы эффективно сортировать итоговые результаты в (недавно созданный) столбец "результат"?



import pandas as pd
import numpy as np
idx = pd.IndexSlice
res = {}
for i in range(5):
res[i] = df.loc[idx[:, :i]].groupby(level="time").sum()
df["Result"] = 0 #fill Result now with res[i] depending on position
493   1  

1 ответ:

Попробуйте использовать cumsum внутри groupby

df.assign(Result=df.groupby(level='time').Value.cumsum())
# suggested by @ScottBoston for pandas 0.20.1+
# df.assign(Result=df.groupby('time').Value.cumsum())

                                  Value     Result
time                Position                      
1493791210867023000 0.0         21156.0    21156.0
                    1.0       1230225.0  1251381.0
                    2.0       1628088.0  2879469.0
                    3.0       2582359.0  5461828.0
                    4.0       3388164.0  8849992.0
1493791210880251000 0.0         21156.0    21156.0
                    1.0       1230225.0  1251381.0
                    2.0       1628088.0  2879469.0
                    3.0       2582359.0  5461828.0
                    4.0       3388164.0  8849992.0
1493791210888418000 0.0         21156.0    21156.0
                    1.0       1230225.0  1251381.0

Comments

    Ничего не найдено.