根据pandas

时间:2018-03-25 17:11:23

标签: python pandas min pandas-groupby

我甚至不确定标题是否有意义。

我有一个包含3列的pandas数据帧:x,y,time。有几千行。示例如下:

       x      y    time
0     225     0  20.295270
1     225     1  21.134015
2     225     2  21.382298
3     225     3  20.704367
4     225     4  20.152735
5     225     5  19.213522
.......
900   437   900  27.748966
901   437   901  20.898460
902   437   902  23.347935
903   437   903  22.011992
904   437   904  21.231041
905   437   905  28.769945
906   437   906  21.662975
.... and so on

我想要做的是检索那些与x和y关联的时间最短的行。基本上对于y上的每个元素,我想找到时间值的最小值,但我想排除时间为0.0 的那些元素。当x与y具有相同的值时会发生这种情况。

因此,例如,获得y-0的最快方法是从x-225开始,依此类推,因此可能是x重复自身而不是y重复的情况。

e.g. 
x      y    time
225     0  20.295270
438     1  19.648954
27     20   4.342732
9     438  17.884423
225   907  24.560400

我到目前为止尝试过组合,但我只得到与y相同的x。

print(df.groupby('id_y', sort=False)['time'].idxmin())

y
0        0
1        1
2        2
3        3
4        4

下面的那个只返回我已经拥有的df。

df.loc[df.groupby("id_y")["time"].idxmin()]

只是指出一件事,如果还有其他非常好的方法,我可以选择开放,而不仅仅是groupby。

1 个答案:

答案 0 :(得分:2)

因此,需要首先删除time等于boolean indexing的行,然后使用您的解决方案:

df = df[df['time'] != 0]
df2 = df.loc[df.groupby("y")["time"].idxmin()]

使用query过滤器的类似替代方法:

df = df.query('time != 0')
df2 = df.loc[df.groupby("y")["time"].idxmin()]

或者sort_values使用drop_duplicates

df2 = df[df['time'] != 0].sort_values(['y','time']).drop_duplicates('y')