在特定索引的列中找到最接近的非零数字

时间:2018-08-12 18:32:38

标签: python pandas

我有一个pandas数据框,其中有

df = pd.DataFrame({'A':[0,0,15,0,0,0,0,0,0,5]})

    A
0   0
1   0
2   15
3   0
4   0
5   0
6   0
7   0
8   0
9   5

现在基于索引(假设为5),我想确定列中最接近的非零数字(此处为索引2和值15),并返回从给定索引到达该索引所花费的跃点。 在给定的示例中,它是从索引2到索引5的+3,如果给定索引是7,则答案将是-2,因为索引是9的值5

4 个答案:

答案 0 :(得分:2)

首先找到所有非零元素的索引:

nonzeros = df[df.A != 0]).index

计算从行到所有行的距离:

anchor = 5
dists = anchor - nonzeros

找到最小距离(按绝对值):

nhops = min(dists, key=abs)

一共:

hnops = min((anchor - df[df.A != 0].index), key=abs)
#3

可以通过重新组合nhopsanchor来计算最接近的非零值的索引:

min_index = anchor - nhops
#2

答案 1 :(得分:1)

使用零/非零的布尔矢量,您可以使用idxmin()计算从给定索引到非零值的距离。这将为您提供“跳跃”,而def get_closest(df, target): df["not_zero"] = df.ne(0) not_zero = pd.Series(df.index[df.not_zero]) dist = not_zero.subtract(target).abs() minidx = not_zero.loc[dist.idxmin()] steps = dist.min() if minidx < target else -dist.min() print("Closest steps to non-zero:", steps) print("Closest non-zero value:", df.A[minidx]) get_closest(df, 5) # Closest steps to non-zero: 3 # Closest non-zero value: 15 get_closest(df, 7) # Closest steps to non-zero: -2 # Closest non-zero value: 5 可以找到实际值。

{{1}}

答案 2 :(得分:1)

IIUC nonzeroargmin

a=df.A.nonzero()[0]
a[abs(np.argmin(a-5))]
Out[950]: 2

答案 3 :(得分:1)

使用numpy.flatnonzero返回数组具有非零值的位置。
减去您要引用的索引,以获取这些位置的方向和距离。

d = np.flatnonzero(df.A.values) - 5
i = d[np.abs(d).argmin()] + 5

df.iloc[i]

A    15
Name: 2, dtype: int64