Pandas Dataframe - 根据两列但大于0查找具有最小值的行

时间:2018-03-24 20:01:22

标签: python pandas

我有一个包含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()]

我知道有一些问题是因为我通常会有一系列问题。

3 个答案:

答案 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