многоиндексная и многоколоночная группировка - PullRequest
0 голосов
/ 06 ноября 2019

У меня есть фрейм данных с индексом 3-х уровней и столбцами 2-х уровней.

                                       Group
                           Label       A        B       C        D
number      start          end              
1           2020-01-01  2020-12-31  -43.0    0      105.0   -37.0
            2020-12-15  2020-12-15  NaN     NaN      NaN    195.0
2           2019-01-01  2019-12-31  -35.0   80.0    -14.0   NaN
            2019-12-17  2019-12-17  NaN     NaN      NaN    141.0
            2020-01-01  2020-12-31  -15.0   45.0    -7.0    NaN
3           2020-12-17  2020-12-17  NaN     NaN      NaN    326.0
            2022-01-01  2022-12-31  NaN     50.0     NaN    NaN
            2023-12-31  2023-12-31  -25.0   NaN      NaN    NaN
            2023-01-01  2023-12-31  NaN    50.0      NaN    NaN            
            2020-12-15  2020-12-15  NaN     NaN      NaN    61.0
.............

Я бы хотел сгруппировать по номеру и начать (только год), суммируя значения по метке:

                                      Group
                           Label       A        B       C        D
number      start          end              
1           2020        2020        -43.0    0      105.0   232.0
2           2019        2019        -35.0   80.0    -14.0   141
            2020        2020        -15.0   45.0    -7.0    NaN
3           2020        2020        NaN     NaN      NaN    387.0
            2022        2022        NaN     50.0     NaN    NaN
            2023        2023        -25.0   50.0     NaN    NaN    
.............

Обратите внимание, что есть также столбец более высокого уровня (называемый Группой, и другие столбцы более высокого уровня, которые я не включаю, чтобы не усложнять его) и другие вложенные столбцы (Метка: A, B, C, D, повторяется для каждого столбца более высокого уровня). как я могу это сделать? заранее спасибо

1 Ответ

2 голосов
/ 06 ноября 2019

Вы можете ссылаться на уровни MultiIndex по имени и использовать DatetimeIndex.year, чтобы получить только год уровней, которые вас интересуют. min_count=1 дает NaN вместо 0 для групповых ячеек, у которых все отсутствует.

df.groupby(['number', 
            df.index.get_level_values('start').year,
            df.index.get_level_values('end').year]).sum(min_count=1)

                      A     B      C      D
number start end                           
1      2020  2020 -43.0   0.0  105.0  158.0
2      2019  2019 -35.0  80.0  -14.0  141.0
       2020  2020 -15.0  45.0   -7.0    NaN
3      2020  2020   NaN   NaN    NaN  387.0
       2022  2022   NaN  50.0    NaN    NaN
       2023  2023 -25.0  50.0    NaN    NaN
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...