首页 > 解决方案 > 第一等值距离

问题描述

我想找到每个值以下出现的第一个。两个“for in”解决方案。有没有更快的方法?

df = pd.DataFrame(columns=list("AB"))
df["A"] = [4,2,4,4,2,5,2,6,1,6,4,5,9,3,7,3,3]

for i, a1 in enumerate(df["A"][:-1]):
    for j, a2 in enumerate(df["A"][i+1:]):
        print(i,a1,j+1,a2)
        if a1 == a2:
            df["B"][i] = j+1
            break

所以:

来源 结果
A[0] = A[2] = 4 B[0] = 2-0 = 2
A[1] = A[4] = 2 B[1] = 4-1 = 3
一种
0 4 2
1 2 3
2 4 1
3 4 7
4 2 2
5 5 6
6 2
7 6 2
8 1
9 6
10 4
11 5
12 9
13 3 2
14 7
15 3 1
16 3

标签: pythonpandaslistnumpydictionary

解决方案


IIUC,你可以试试:

df = (
    df.reset_index()
    .groupby('A')
    .apply(lambda x: x['index'].diff().shift(-1))
    .reset_index(0)
    .sort_index()
    .convert_dtypes()
    .rename(columns = {'index': 'B'})
    )

输出:

   A     B
0   4     2
1   2     3
2   4     1
3   4     7
4   2     2
5   5     6
6   2  <NA>
7   6     2
8   1  <NA>
9   6  <NA>
10  4  <NA>
11  5  <NA>
12  9  <NA>
13  3     2
14  7  <NA>
15  3     1
16  3  <NA>

推荐阅读