我在3-d空间中有一个对象成分的数据集df
-每个ID
代表一个具有各种成分的对象:
ID Comp x y z
A 1 2 2 1
A 2 2 1 -1
A 3 -10 1 -10
A 4 -1 3 -5
B 1 3 0 0
B 2 3 0 -5
...
我想遍历每个ID
,使用sklearn
中的聚类技术根据每个组件(Comp
,{ {1}},x
)坐标-实现以下目标:
y
例如-z
:ID Comp x y z cluster
A 1 2 2 1 1
A 2 2 1 -1 1
A 3 -10 1 -10 2
A 4 -1 3 -5 3
B 1 3 0 0 1
B 2 3 0 -5 1
...
比较ID
集群A,
ID :1 is in
A,1, whereas
:4在{{1 }} 3. (我打算稍后再连接:
和Comp
)。
我对以下cluster
不太满意:
ID
我可以通过在cluster
上使用groupby + apply
循环来强行使用它,但是我的数据集很大(〜150k from sklearn.cluster import AffinityPropagation
ap = AffinityPropagation()
df['cluster']=df.groupby(['ID','Comp']).apply(lambda x: ap.fit_predict(np.array([x.x,x.y,x.z]).T))
),我担心资源和时间的限制。任何帮助都会很棒!
答案 0 :(得分:1)
IIUC,我想您可以尝试这样的事情:
def ap_fit_pred(x):
ap = AffinityPropagation()
return pd.Series(ap.fit_predict(x.loc[:,['x','y','z']]))
df['cluster'] = df.groupby('ID').apply(ap_fit_pred).reset_index(drop=True)