[英]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.