Pandas Dataframe – найдите строку с минимальным значением на основе двух столбцов, но больше 0

Вопрос: У меня есть dataframe с 3 столбцами: x, y, time. Есть несколько тысяч строк. То, что я хочу сделать, это получить строку с минимальным временем, но я бы хотел, чтобы минимум не должен быть 0. например x y time 240 1 28.5 240 2 19.3 240 240 0 240 19 9.7 До сих пор

Вопрос:

У меня есть dataframe с 3 столбцами: x, y, time. Есть несколько тысяч строк.

То, что я хочу сделать, это получить строку с минимальным временем, но я бы хотел, чтобы минимум не должен быть 0.

например

x y time 240 1 28.5 240 2 19.3 240 240 0 240 19 9.7

До сих пор я пробовал следующее:

df.loc[df[‘time’] > 0].min() # this gives me a series and I want a row # x 225.000000 # y 0.000000 # time 1.066606 df[‘time’].drop_duplicates().nsmallest(1) # 225 0.0

Я тоже пробовал что-то с группой

df.loc[df.groupby(‘id_x’, sort=False)[‘time’].idxmin()]

У меня были проблемы с подмножеством этого, поскольку у меня обычно была серия.

Лучший ответ:

Вы можете отфильтровать 0 значений по query и получить индекс минимального значения по idxmin, последний select by loc:

s = df.loc[df.query(‘time != 0’)[‘time’].idxmin()] print (s) x 240.0 y 19.0 time 9.7 Name: 3, dtype: float64 df = df.loc[[df.query(‘time != 0’)[‘time’].idxmin()]] print (df) x y time 3 240 19 9.7 Ответ №1

Попробуй это:

In [69]: df.loc[df.time>0, ‘time’].idxmin() Out[69]: 3

или

In [72]: df.loc[[df.loc[df.time>0, ‘time’].idxmin()]] Out[72]: x y time 3 240 19 9.7 Ответ №2

Вам совсем не нужна groupby. Здесь опция с mask/where + loc + idxmin;

df.loc[[df.time.mask(df.time.eq(0)).idxmin()]]

Или,

df.loc[[df.time.where(df.time.ne(0)).idxmin()]] x y time 3 240 19 9.7

Оцените статью
Добавить комментарий