#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 .