Суммирование данных в пандах с несколькими группами - PullRequest
0 голосов
/ 11 июня 2018

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

df2 = pd.DataFrame({'season':[1,1,1,2,2,2,3,3],'value' : [-2, 3,1,5,8,6,7,5], 'avail':[3,3,3,8,8,4,25,25],'test2':[4,5,7,8,9,10,11,12]},index=['2020', '2020', '2020','2020', '2020', '2021', '2021', '2021']) 
df2.index=  pd.to_datetime(df2.index)  
df2.index = df2.index.year
print(df2)

      avail  season  test2  value
2020      3       1      4     -2
2020      3       1      5      3
2020      3       1      7      1
2020      8       2      8      5
2020      8       2      9      8
2021      4       2     10      6
2021     25       3     11      7
2021     25       3     12      5

Я хотел бы эффективно рассчитать для каждого года сумму столбца «в наличии».Трудность состоит в том, чтобы суммировать только одно «полезное» значение для каждого сезона.Например, для 2020 года я хочу сложить 3 + 8 = 11.

Ожидаемый результат (столбец 'sum_avail'):

        avail  season  test2  value   sum_avail
2020      3       1      4     -2        11
2020      3       1      5      3        11
2020      3       1      7      1        11 
2020      8       2      8      5        11
2020      8       2      9      8        11
2021      4       2     10      6        29
2021     25       3     11      7        29
2021     25       3     12      5        29  

Ответы [ 3 ]

0 голосов
/ 11 июня 2018

Вам понадобится groupby + transform + np.unique:

df2['sum_avail'] = (
     df2.groupby(level=0).avail.transform(lambda x: np.unique(x).sum()))

Или

df2['sum_avail'] = df2.groupby(level=0).avail.transform('unique').apply(sum)

df2

      avail  season  test2  value  sum_avail
2020      3       1      4     -2         11
2020      3       1      5      3         11
2020      3       1      7      1         11
2020      8       2      8      5         11
2020      8       2      9      8         11
2021      4       2     10      6         29
2021     25       3     11      7         29
2021     25       3     12      5         29
0 голосов
/ 11 июня 2018

Вот подход, который принимает первое значение в каждой паре индекс / сезон, а затем суммирует их:

res = df2.groupby([df2.index, 'season'])['avail'].first().sum(level=0)
df2.join(res.rename('sum_avail'))

      season  value  avail  test2  sum_avail
2020       1     -2      3      4         11
2020       1      3      3      5         11
2020       1      1      3      7         11
2020       2      5      8      8         11
2020       2      8      8      9         11
2021       2      6      4     10         29
2021       3      7     25     11         29
2021       3      5     25     12         29
0 голосов
/ 11 июня 2018

IIUC, transform + set

df2.groupby(level=0).avail.transform(lambda x : sum(set(x)))
Out[220]: 
2020    11
2020    11
2020    11
2020    11
2020    11
2021    29
2021    29
2021    29
Name: avail, dtype: int64
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...