Вопрос:
У меня есть 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