Pandas: найдите максимальное значение во всех столбцах и распечатайте эту строку

#python-3.x #pandas

#python-3.x #pandas

Вопрос:

У меня есть большой фрейм данных с нормализованными и масштабированными данными, которые должны находиться в диапазоне 0-1. Но когда я печатаю его максимальные значения, я получаю — 1.000000002. describe() метод не показывает это значение. Итак, я пытаюсь определить проблему и хочу напечатать соответствующую строку. Все другие ответы, которые я получил, говорят о печати строки с максимальным значением определенного столбца. Как я могу напечатать строку, содержащую максимальное значение для всего фрейма данных? Буду признателен за вашу помощь!

 test = pd.DataFrame({'att1'  : [0.1, 0.001, 0.0001,
                            1, 2,
                            0.5, 0, -1, -2],
                   'att2':[0.01, 0.0001, 0.00001,
                            1.1, 2.2,
                            2.37, 0, -1.5, -2.5]})
test.max().max()
Out: 2.37000
  

Желаемый результат:

     att1    att2
5   0.5     2.37
  

UPD:
Я обновил тестовый фрейм данных, поскольку это вызвало путаницу (моя вина!). Мне нужно напечатать одну строку, содержащую максимальное значение для всего фрейма данных.

Ответ №1:

Я использую idxmax здесь после stack

 test.iloc[[test.stack().idxmax()[0]]]
Out[154]: 
   att1  att2
5   2.3  2.37
  

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

1. почему вы используете stack ? Я думал, что лучше просто передать серию возвратов из idxmax в iloc и выбрать 1st строку, чем использовать стек: test.iloc[test.idxmax()].head(1)

2. @andy вы предполагаете, что оба максимума для каждого столбца отображаются в одной строке.

3. да, основывайтесь на его данных. В противном случае test.iloc[test.idxmax()] было бы достаточно показать обе строки. Кажется, он хочет показать строки, где att1 и att2 является максимальным. Итак, если att1_max находится в другой строке, чем att2_max, отображение обеих строк имеет смысл. Если ему просто нужно знать att1_max и att2_max, тогда test.agg(['max']) лучше

Ответ №2:

Давайте используем np.where, который возвращает индекс строки и столбца:

 r, _ = np.where(test.values == np.max(test.values))
test.iloc[r]
  

Вывод:

    att1  att2
5   2.3  2.37
  

Ответ №3:

Редактировать:
После дальнейшего объяснения, я думаю, сравнение массива с более гибким следующим образом values values.max() :

 test[test.values == test.values.max()]
  

Он возвращает строку max_value фрейма данных. В случае, если att1_max совпадает с att2_max, но в разных строках, он возвращает обе строки. В этом случае, если предпочтительнее использовать одну строку, добавьте head(1) к ней.

att1_max и att2_max в одной строке:

 Out[660]:
     att1     att2
0  0.1000  0.01000
1  0.0010  0.00010
2  0.0001  0.00001
3  1.0000  1.10000
4  2.0000  2.20000
5  2.3000  2.37000
6  0.0000  0.00000
7 -1.0000 -1.50000
8 -2.0000 -2.50000

In [661]: test[test.values == test.values.max()]
Out[661]:
   att1  att2
5   2.3  2.37
  

att1_max и att2_max в разных строках:

 Out[664]:
     att1     att2
0  0.1000  0.01000
1  0.0010  0.00010
2  0.0001  0.00001
3  1.0000  1.10000
4  2.0000  2.20000
5  2.3000  1.37000
6  0.0000  0.00000
7 -1.0000 -1.50000
8 -2.0000 -2.50000

In [665]: test[test.values == test.values.max()]
Out[665]:
   att1  att2
5   2.3  1.37
  

att1_max совпадает с att2_max, но в разных строках (в этом случае stack возвращается только 1 строка, в то время как это возвращает обе строки)

 Out[668]:
      att1      att2
0   0.1000   0.01000
1  25.0500   0.00010
2   0.0001   0.00001
3   1.0000   1.10000
4   2.0000   2.20000
5   2.3000   1.37000
6   0.0000   0.00000
7  -1.0000  25.05000
8  -2.0000  -2.50000

In [669]: test[test.values == test.values.max()]
Out[669]:
    att1     att2
1  25.05   0.0001
7  -1.00  25.0500
  

Примечание: в последнем случае, если требуется возвращать single, просто добавьте head(1)

 In [670]: test[test.values == test.values.max()].head(1)
Out[670]:
    att1    att2
1  25.05  0.0001    
  

Примечание 2: если att1_max и att2_max одинаковы и находятся в одной строке, эта строка будет отображаться дважды. В этом случае используйте drop_duplicates() для его обработки.

Оригинал:

ответ @Wen-Ben хороший, но я думаю, что использование stack здесь не требуется. Я предпочитаю idxmax и drop_duplicates :

 test.iloc[test.idxmax()].drop_duplicates()    
  

или

 test.loc[test.idxmax().drop_duplicates()]
  

att1_max и att2_max в одной строке:

 In [510]: test.iloc[test.idxmax()].drop_duplicates()
Out[510]:
   att1  att2
5   2.3  2.37
  

att1_max и att2_max в разных строках:

 In [513]: test.iloc[test.idxmax()].drop_duplicates()
Out[513]:
   att1  att2
5   2.3  1.37
4   2.0  2.20
  

Итак, att1_max и att2_max находятся в одной строке, возвращают точную 1 строку. att1_max и att2_max находятся в разных строках, возвращают 2 строки, где существуют att1_max и att2_max .

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

1. Привет! Мне нужно напечатать только ту строку, которая содержит максимальное значение для всего фрейма данных. Таким образом, результатом во втором примере должна быть только строка с индексом 5.

2. а, понятно. В случае, если att1_max имеет то же значение, что и att2_max, но они находятся в разных строках, вы хотите показать обе строки или любую строку?

3. @aviss Ммм, я думаю, именно поэтому я использую stack .