我有一个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
答案 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
可以通过重新组合nhops
和anchor
来计算最接近的非零值的索引:
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 nonzero
和argmin
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