我正在分析一些光谱数据,我的数据帧索引是具有小数点后 9 位精度的数字。如果我不输入确切的索引,数据框将不会返回值。我必须使用 df.iloc(N),但这需要我继续猜测哪个索引最接近所需索引。是否有某种方法可以让我输入 df[600],它为我提供最接近该数字的索引?
我尝试过iloc。还有一种过于繁琐的解决方案,即首先手动定位索引,
df.index[np.abs(df.index - target_value).argmin()] 然后使用该索引,但是没有更快的方法吗?
如果您想要一种快速方法,您可以使用基于 numpy.searchsorted
的这个出色方法的变体:
def get_closest(df, values):
# get index as numpy array
a = df.index.to_numpy()
# get insert positions
idxs = np.searchsorted(a, values, side="left")
# find indexes where previous index is closer
prev_idx_is_less = ((idxs == len(a)) |
(np.fabs(values - a[np.maximum(idxs-1, 0)])
< np.fabs(values - a[np.minimum(idxs, len(a)-1)])))
idxs[prev_idx_is_less] -= 1
# index DataFrame
return df.loc[a[idxs]]
get_closest(df, [0.487948])
# col
# 0.437587 2
get_closest(df, [0.487948, 0.6432008])
# col
# 0.437587 2
# 0.645894 6