Pandas: поиск максимально минимальных строк для каждого столбца в фрейме данных

#python #pandas #dataframe

#python #pandas #фрейм данных

Вопрос:

Я пытаюсь найти максимально минимальные строки каждого столбца в фрейме данных. Я даже не знаю, с чего начать. Я думаю df.groupby agg , что это не сработает, потому что мне нужна вся строка.

Вот пример данных

 import pandas as pd
df = pd.DataFrame(
{'A': array([4, 9, 2, 3, 3, 5, 7, 0, 4, 6]),
 'B': array([4, 2, 4, 8, 4, 3, 1, 6, 9, 2]),
 'C': array([8, 1, 8, 1, 2, 2, 7, 5, 9, 8]),
 'D': array([9, 4, 2, 8, 0, 3, 6, 9, 3, 8])}
)
 

Ожидаемый выход

         A B C D
1 A max 9 2 1 4
7 A min 0 6 5 9
8 B max 4 9 9 3
6 B min 7 1 7 6
8 C max 4 9 9 3
1 C min 9 2 1 4
0 D max 4 4 8 9
4 D min 3 4 2 0
 

если есть несколько строк с одинаковым значением min / max, все в порядке, если он возвращает любую из них.

PS: я бы хотел, чтобы он сохранил исходный индекс.

Ответ №1:

agg Тогда давайте попробуем idxmin, idxmax merge :

 out=(df.agg(['idxmin','idxmax']).unstack().reset_index(name='idx')
       .merge(df, left_on='idx', right_index=True, how='left')
    )
 

Вывод ( idx является исходным индексом):

   level_0 level_1  idx  A  B  C  D
0       A  idxmin    7  0  6  5  9
1       A  idxmax    1  9  2  1  4
2       B  idxmin    6  7  1  7  6
3       B  idxmax    8  4  9  9  3
4       C  idxmin    1  9  2  1  4
5       C  idxmax    8  4  9  9  3
6       D  idxmin    4  3  4  2  0
7       D  idxmax    0  4  4  8  9
 

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

1. Это работает с моими образцами данных! Не могли бы вы сообщить мне, какую часть изменить, если у меня мультииндекс?

2. выполните df=df.reset_index() перед вышеизложенным. Это превращает ваши данные в индексированный диапазон. Вы можете сбросить индекс, как только у вас есть out .

3. тогда он также не будет агрегироваться по индексу? Может быть, удалить эти строки?