我有一个 DataFrame,每行都由 0 和 1 组成,其想法是将每个 df 中的所有行与特定数量的簇进行比较和聚类(在本例中假设为 5)。
我需要获取的是 5 个簇中每一个簇的行索引(或
.groupby
按具有原始行索引的簇)。
df 看起来像这样:
0 1 2 3 4 5 6 7 8 9 ... 528 529 530 531 532 533 534 535 536 537
0 0 0 0 0 0 0 0 1 1 1 ... 0 1 1 1 0 0 0 1 0 1
1 0 0 0 0 0 0 0 1 1 1 ... 0 1 1 1 0 0 0 1 0 1
2 0 0 0 0 0 0 0 1 1 1 ... 0 1 1 1 0 0 0 1 0 1
3 0 0 0 0 0 0 0 0 0 0 ... 0 0 0 1 0 0 0 0 1 1
4 0 0 0 0 0 0 0 0 0 0 ... 0 0 0 1 0 0 0 0 0 1
... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ...
137 0 0 0 0 0 0 0 0 0 0 ... 0 0 0 0 0 1 0 0 0 0
138 1 1 0 0 0 0 0 0 0 1 ... 0 0 0 0 0 1 0 0 0 0
139 1 1 1 0 0 0 0 0 0 0 ... 0 0 0 0 0 1 0 0 0 0
140 1 1 0 0 0 0 0 0 0 1 ... 0 0 0 0 0 1 0 0 0 0
141 1 1 1 0 0 0 0 0 0 0 ... 0 0 0 0 0 1 0 0 0 0
我在这里找到了另一个提供此解决方案的答案: 对 pandas 数据框中的每个组进行 Kmeans 聚类并分配聚类
def cluster(X):
k_means = KMeans(n_clusters=5).fit(X)
return X.groupby(k_means.labels_)\
.transform('mean').sum(1)\
.rank(method='dense').sub(1)\
.astype(int).to_frame()
我得到的结果是:
0
0 1
1 1
2 1
3 0
4 0
... ...
137 3
138 1
139 3
140 3
141 3
但公平地说,我并不完全理解它的作用,以及我在这里得到的结果是否是每行的簇号
我也不完全确定你的示例片段的作用,但对于你的用例来说,这样的东西会起作用。首先,获取集群标签:
from sklearn.cluster import KMeans
df["cluster"] = KMeans(n_clusters=5).fit(df).labels_
然后,如果您需要对每个簇的索引执行某些操作,您可以使用
groupby("cluster").indices
将它们作为字典获取
>>> df.groupby("cluster").indices
{0: array([0, 1]), 1: array([2, 3]), ...}