首页 > 解决方案 > Python:如何从具有多列的数据框中循环遍历每两列组合以进行聚类?

问题描述

我有一个原始数据框(每个客户为不同产品购买的数量)有多个列,如下所示:

请点击此处参考数据框示例

我的目标是对原始数据框中的每两个产品进行聚类。为简单起见,我尝试通过获取客户、产品 1 和产品 2 来进行聚类。我的数据框如下所示(忽略客户列,仅获取两个产品的数据) df = 请单击此处参考数据框示例

考虑下面我用于聚类和可视化的代码。

from sklearn.cluster import KMeans
wcss = []
for i in range(1, 11):
    kmeans = KMeans(n_clusters = i, init = 'k-means++')
    kmeans.fit(df)
    wcss.append(kmeans.inertia_)
plt.plot(range(1, 11), wcss)
plt.title('The Elbow Method')
plt.xlabel('Number of clusters')
plt.ylabel('WCSS')
plt.show()

# 4 clusters
# Fitting K-Means to the dataset
kmeans = KMeans(n_clusters = 4, init = 'k-means++')
y_kmeans = kmeans.fit_predict(df)

# Visualising the clusters
plt.scatter(df[y_kmeans == 0, 0], df[y_kmeans == 0, 1], s = 20, c = 'red', label = 'Cluster 1')
plt.scatter(df[y_kmeans == 1, 0], df[y_kmeans == 1, 1], s = 20, c = 'blue', label = 'Cluster 2')
plt.scatter(df[y_kmeans == 2, 0], df[y_kmeans == 2, 1], s = 20, c = 'green', label = 'Cluster 3')
plt.scatter(df[y_kmeans == 3, 0], df[y_kmeans == 3, 1], s = 20, c = 'yellow', label = 'Cluster 4')
plt.title('Clusters of customers')
plt.xlabel('Product1 (000 TO)')
plt.ylabel('Product2 (000 TO)')
plt.legend()
plt.show()

这对一对来说效果很好,但我的目标是对我原始数据框中的两个产品组合中的每一个都做。

我尝试搜索这个并用于循环和迭代,但无法实现我的最终目标。我不是循环方面的专家,并且从几个月开始就开始使用 python ..您的帮助将不胜感激..

你可以修复 no 。在您的答案中,簇数为 4。让我也粘贴到我迄今为止为此尝试过的内容下方,并且仍在弄清楚下一步是什么。

如果我的问题不清楚,请告诉我..或者我需要添加更多细节..提前非常感谢

from  itertools import combinations


from sklearn.cluster import KMeans

[编辑] ..下面是我的最新代码..为了更简单..我正在尝试迭代下面的代码,用于所有对组合的一对

# kmeans for one pair

kmeans = KMeans(n_clusters = 4, init = 'k-means++')
X=df.iloc[:, [0,1]].values
kmeans.fit(X)
y_kmeans = kmeans.fit_predict(X)

kmeans循环

kmeans = KMeans(n_clusters = 4, init = 'k-means++')
combos = list(combinations(df.columns,2))
for combo in combos:
    for i in range(0,len(combos)):
        X=df.loc[:,combos[i]].values
        kmeans.fit(X)
        y_kmeans=kmeans.fit_predict(X)

循环一次只给了我最后一对的输出,而它应该给我所有这对的输出..我不确定,我在这里缺少什么..

标签: pandasloopsdataframeiterationcluster-analysis

解决方案


您可以使用itertools.combinations创建所有成对组合,然后将fit所有模型for loop附加到一个list类似中:

from itertools import combinations
from sklearn.cluster import KMeans

combos = list(combinations(df.columns,2))
models = []
for combo in combos:
    model =  kmeans.fit(df[list(combo)]
    models.append(model)

推荐阅读