按值几乎相同的自定义函数分组/聚类(?)

  • 本文关键字:聚类 自定义函数 pandas
  • 更新时间 :
  • 英文 :


我有一个数据帧:

import pandas as pd
df = pd.DataFrame({'vals':[2.5, 3, 4, 2.5, 10, 11, 9], 'group':''})
vals group
0   2.5      
1   3.0      
2   4.0      
3   2.5      
4  10.0      
5  11.0      
6   9.0  

并希望为每一行分配一个组,其中vals中的值与函数非常接近(该函数是虚构的,在现实中更复杂,但返回True/False(:

def similar(val1, val2):
if abs(val1-val2)<=3:
return True
else:
return False

因此,第一个值2.5应该与所有值进行比较,如果函数为True,则它们应该得到相同的分组。例如,类似(2.5,3(、类似(2.5、4(、相似(2.5、2.5(都返回True,因此应该对它们进行分组。然后转到10。
创建:

vals group
0   2.5   0      
1   3.0   0      
2   4.0   0      
3   2.5   0     
4  10.0   1      
5  11.0   1     
6   9.0   1 

我一直在尝试这样的东西。但我无法让它发挥作用,我想一定有一些更聪明的熊猫方法可以使用一个函数进行分组:

for i in df.index.tolist():
df['group'].iloc[i] = group
v1 = df['vals'].iloc[i]
for j in df.index.tolist()[i+1:]:
print(i,j)
v2 = df['vals'].iloc[j]
if similar(v1, v2):
df['group'].iloc[j] = group

我知道,这不是一个很明确的问题。但我希望至少有人能指出某个方向,这样我就可以在谷歌上搜索。。。

我对值进行排序,然后用上一个值检查.diff((,然后用.gt((检查这个diff是否大于max_distance:

import pandas as pd
df = pd.DataFrame({'vals':[2.5, 3, 4, 2.5, 10, 11, 9, 30]})
df = df.sort_values(by='vals')
max_distance = 3
df['group'] = (df
.diff()
.gt(max_distance)
.cumsum()
)

结果数据帧:

vals    group
0   2.5     0
1   3.0     0
2   4.0     0
3   2.5     0
4   10.0    1
5   11.0    1
6   9.0     1
7   30.0    2

另请参阅以获得类似的答案:
Python-pandas-如何对封闭元素进行分组

最新更新