Многоиндексный фрейм данных Pandas — выбор максимального значения из одного индекса в многоколоночном индексе multiindex

#python #pandas

#python #pandas

Вопрос:

Ниже приведен фрейм данных, как найти выделенный результат. Я нашел многорядный максимум в столбце A.

                 col_0  col_1
Caps Lower            
A    a     0  0.246490   2
           1 -1.265711   5
           2 -0.477415   6
           3 -0.355812   1
           4 -0.724521   2
     b     0 -0.409198   1
           1 -0.062552   1
           2 -0.731789   9 
           3  1.131616   5 
           4  0.085248   3 
B    a     0  0.193948   7
           1  2.010710   6
           2  0.289300   4
           3  0.305373   3
           4  1.376965   4
     b     0  0.210522   1
           1  1.431279   3
           2 -0.247171   1
           3  0.899074   8
           4  0.639926   1
 

результат должен быть :

         col_0  col_1
Caps          
A    -0.731789   9
B     0.899074   8
 

Как я могу найти максимум с col_1 помощью?

Ответ №1:

на основе вашего желаемого вывода примера, ваш вопрос, похоже, звучит так: как мне вернуть строки с наибольшим col_1 значением для каждой Caps группы.

Ваш пример ввода делает его похожим 'Caps' на ваши индексы и 'Lower' является вашими индексами, но это немного проще, если они не являются индексами, а просто обычными столбцами.

Я настроил ваши данные следующим образом:

 df = pd.DataFrame({'Caps': np.repeat(['A', 'B'], 10),
             'Lower': list(np.repeat(['a', 'b'], 5)) * 2,
              'col_0': [0.246490, -1.265711, -0.477415, -0.355812, -0.724521,
                        -0.409198, -0.062552, -0.731789, 1.131616, 0.085248,
                        0.193948, 2.010710, 0.289300, 0.305373, 1.376965,
                        0.210522, 1.431279, -0.247171, 0.899074, 0.639926],
              'col_1': [2, 5, 6, 1, 2, 1, 1, 9, 5, 3, 7, 6, 4, 3, 4, 1, 3, 1, 8, 1]
             })
 

[pandas.Series.idxmax][1] должно помочь, которое возвращает индексы строк с наибольшим col_1 значением для каждой Caps группы:

 df.groupby('Caps')['col_1'].idxmax()
# Caps
# A     7
# B    18
# Name: col_1, dtype: int64
 

Подключаем это:

 df.loc[df.groupby('Caps')['col_1'].idxmax()]
#    Caps   Lower   col_0       col_1
# 7  A      a      -0.731789    9
# 18 B      b       0.899074    8
 

Комментарии:

1. TANX. исправьте свой ответ и можете использовать: df.loc[df.groupby(level= 0)[‘col_1’].idxmax()]

2. Хороший момент. Если ваш фрейм данных pd настроен с «шапками» и «Ниже» в качестве индексов, вы можете использовать .groupby(level=0)