我有一个包含3列的数据框:x,y,time。有几千行。
我想要的是以最短的时间检索行,但我希望最小值不应为0.
e.g。
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
我也尝试过使用groupby的东西
df.loc[df.groupby('id_x', sort=False)['time'].idxmin()]
我知道有一些问题是因为我通常会有一系列问题。
答案 0 :(得分:4)
您可以按query
过滤0
个值,并按idxmin
获取最小值索引,最后由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 :(得分:4)
试试这个:
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 :(得分: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