簡體   English   中英

查找值最接近給定數字的行

[英]Finding rows with closest values to a given number

我有下面的數據框,我將其稱為“ 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的三個索引。

您可以按照以下步驟進行操作:

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

創建一個dif列,並在dif上使用groupby並獲得第一個組。

(
    df.assign(dif=df['value'].sub(my_value).abs())
    .groupby(by='dif', sort=True)
    .pipe(lambda x: next(iter(x))[1])
)

你可以試試

min_diff = 0 
my_value = 1
pos_1 = my_value - min_diff
pos_2 = my_value + min_diff
min_accept = min(pos_1, pos_2)
max_accept = max(pos_1, pos_2)

df[df.values.between(min_accept, max_accept)] 
mad=0
my_value = 1
df.loc[(df['value'].sub(my_value).abs())== mad,'value']

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM