python - 第一等值距离
问题描述
我想找到每个值以下出现的第一个。两个“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 | 钠 |
解决方案
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>
推荐阅读
- c - 取消时如何收集线程退出状态(使用连接)
- django - Django F() - 避免自动括号
- arrays - scipy.optimize 约束方法中的边界数组形状问题
- cryptography - 错误:获取广播客户端时出错:rpc 错误:代码 = 不可用 desc = 传输:写入 tcp
- python - 坐标函数更新列表并存储它们以被调用
- html - 无需使用 CSS 或 JS 即可创建 SVG 饼图的数学
- python - 使用现有 TimeSerie 中的索引和另一个 TimeSerie 中的列在 Pandas 中创建一个 DataFrame
- azure - 向 Azure Device Streams 添加身份验证
- javascript - Nodejs,尝试将var导出到另一个文件但值没有改变
- python - (Python)脚本可以永久编辑我的系统路径变量吗?