我有一个数据框,下面将其称为“ df”:
idx value
---- -----
0 1
1 1
2 1
3 0
4 2
5 3
6 4
7 4
8 5
9 6
例如,我的值是:
my_value = 1
我的目标是使所有最接近my_value的行在df [value]-my_value之间具有最小的绝对差。
例如,在这种情况下,我有三行匹配,分别是:
idx value
----- -------
0 1
1 1
2 1
这三行具有相同的绝对差,即零,这是我要获取的行。
我一直在研究这样的一些功能:
df_result = df.iloc[(df['values'].sub(value)).abs().idxmin()]
但是我发现的所有解决方案仅给了我指示的行数,并且在重复值的情况下失败了。
例如,上面的代码仅返回第一行的索引0,而不返回包含值1的三个索引。
答案 0 :(得分:2)
您可以执行以下操作:
query=1
# create a series with the absolute difference to your query value
ser_abs_diff= (df['value']-query).abs()
# extract the minimum
min_val= ser_abs_diff.min()
# apply it to your dataframe
df[ser_abs_diff==min_val]
使用以下测试数据(请注意,我将第5行更改为值7,使其更加有趣):
df= pd.DataFrame(dict(value=[1, 1, 1, 0, 2, 7, 4, 4, 5, 6]))
您得到:
# with query=1
Out[82]:
value
idx
0 1
1 1
2 1
# with query=3
Out[83]:
value
idx
4 2
6 4
7 4
答案 1 :(得分:1)
创建一个dif列,并在dif上使用groupby并获得第一个组。
(
df.assign(dif=df['value'].sub(my_value).abs())
.groupby(by='dif', sort=True)
.pipe(lambda x: next(iter(x))[1])
)
答案 2 :(得分:0)
您可以尝试
thorntail
答案 3 :(得分:0)
mad=0
my_value = 1
df.loc[(df['value'].sub(my_value).abs())== mad,'value']