Как я могу получить строку с min для определенного столбца в фрейме данных Pandas?

#python #pandas

#python #pandas

Вопрос:

Мой фрейм данных:

                                                model  epochs       loss
0  <keras.engine.sequential.Sequential object at ...       1  0.0286867
1  <keras.engine.sequential.Sequential object at ...       1  0.0210836
2  <keras.engine.sequential.Sequential object at ...       1  0.0250625
3  <keras.engine.sequential.Sequential object at ...       1   0.109146
4  <keras.engine.sequential.Sequential object at ...       1   0.253897
  

Я хочу получить строку с наименьшим loss значением.

Я пытаюсь self.models['loss'].idxmin() , но это выдает ошибку: TypeError: reduction operation 'argmin' not allowed for this dtype

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

1. Я не знаю, как выглядят данные, поэтому попробуйте pd.to_numeric(self.models['loss'], errors='coerce').idxmin() использовать это для индексации.

Ответ №1:

Есть несколько способов сделать именно это:

Рассмотрим этот пример фрейма данных

 df

level    beta
0   0   0.338
1   1   0.294
2   2   0.308
3   3   0.257
4   4   0.295
5   5   0.289
6   6   0.269
7   7   0.259
8   8   0.288
9   9   0.302
  

1) Использование условных обозначений pandas

 df[df.beta == df.beta.min()]  #returns pandas DataFrame object

level   beta
3   3   0.257
  

2) Использование sort_values и выбор первого (0-го) индекса

 df.sort_values(by="beta").iloc[0]    #returns pandas Series object

level        3
beta     0.257
Name: 3, dtype: object
  

Я думаю, это наиболее читаемые методы

Редактировать :

Создал этот график, чтобы визуализировать время, затрачиваемое двумя вышеупомянутыми методами на увеличение количества строк в фрейме данных. Хотя это во многом зависит от рассматриваемого фрейма данных, sort_values значительно быстрее, чем условные выражения, когда количество строк превышает 1000 или около того.

Время, затрачиваемое sort_values и условным значением, в сравнении с количеством строк в фрейме данных

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

1. Какие методы самые быстрые?

Ответ №2:

 self.models[self.models['loss'] == self.models['loss'].min()]
  

Даст вам строку с наименьшими потерями (при условии, что self.models является вашим df). добавьте .index, чтобы получить номер индекса.

Ответ №3:

Надеюсь, это сработает

 import pandas as pd
df = pd.DataFrame({'epochs':[1,1,1,1,1],'loss':[0.0286867,0.0286867,0.0210836,0.0109146,0.0109146]})
out = df.loc[df['loss'].idxmin()]