我甚至不确定标题是否有意义。
我有一个包含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。
答案 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')