查找值最接近给定数字的行

时间:2019-08-18 06:09:08

标签: python pandas

我有一个数据框,下面将其称为“ 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的三个索引。

4 个答案:

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