我有一个包含两个参数的数据框,
val1
和val2
。
val1
代表频谱中的一个点val2
该点测量的电平现在我想用以下逻辑对该谱进行聚类:
val1
与之前的值进行比较。如果 previous_row >= 1.3 * val1 | previous_row <= 0.7 * val1
它被认为是一个新的集群。我不知道如何在不循环的情况下解决这个问题,并且由于现实世界的数据非常大(数百万行),性能至关重要。非常感谢任何帮助。
这是与 MWE 相关的可视化示例:
import pandas as pd
import numpy as np
np.random.seed(3)
df = pd.DataFrame({
"val1":np.arange(1,11)
, "val2":np.random.randint(20, 50, 10)
})
df["desired_output"] = [1, 2, 2, 3, 4, 5, 5, 6, 6, 6]
val1 val2 desired_output
0 1 30 1
1 2 44 2
2 3 45 2
3 4 23 3
4 5 44 4
5 6 28 5
6 7 20 5
7 8 41 6
8 9 49 6
9 10 39 6
使用
shift
访问先前的值,计算掩码并使用 cumsum
:
prev = df['val2'].shift()
df['out'] = (prev.ge(df['val2']*1.3) | prev.le(df['val2']*0.7)).cumsum()
输出:
val1 val2 desired_output out
0 1 30 1 0
1 2 44 2 1
2 3 45 2 1
3 4 23 3 2
4 5 44 4 3
5 6 28 5 4
6 7 20 5 5
7 8 41 6 6
8 9 49 6 6
9 10 39 6 6