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

Posted

技术标签:

【中文标题】Python:如何从具有多列的数据框中循环遍历每两列组合以进行聚类?【英文标题】:Python: How to loop through each two column combination from dataframe having multiple columns to do clustering? 【发布时间】:2019-04-05 17:51:24 【问题描述】:

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

Please click here to refer example of dataframe

我的目标是对原始数据框中的每两个产品进行聚类。为简单起见,我尝试通过获取客户、产品 1 和产品 2 来进行聚类。 我的数据框看起来像这样(客户列被忽略,只获取两个产品的数据) df = Please click here to refer example of dataframe

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

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..您的帮助将不胜感激..

你可以解决没有。在您的答案中,簇数为 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)

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

【问题讨论】:

【参考方案1】:

您可以使用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)

【讨论】:

感谢您的回复。我尝试了组合,它在创建所有对组合时对我来说效果很好,但 for 循环不适合模型。使用上述循环返回组合作为组合中的最后一对元素 我在下面粘贴了一个我使用过的代码..我将 y_kmeans 作为集群输出,但它只给了我一列..即它只输出最后一对元素,而不是组合中的所有元素对 combos = list(combinations(df.columns,2)) kmeans = KMeans(n_clusters = 4, init = 'k-means++') 组合中的组合:kmeans.fit(df[list(组合)]) y_kmeans=kmeans.fit_predict(df[list(combo)]) @kull1n 如果你想跟踪每个模型,你可以将它们存储到一个列表中,就像编辑显示的那样

以上是关于Python:如何从具有多列的数据框中循环遍历每两列组合以进行聚类?的主要内容,如果未能解决你的问题,请参考以下文章

如何在数据框中聚合具有多列的重复行[重复]

如何使用函数迭代python中数据框的每两列?

如何获取具有多列的时间序列数据框中的每小时平均值

如何使用列列表从数据框中删除多列[重复]

将数据框中的两列或多列合并为具有新名称的新列

如何为数据框中的多列循环 Bartlett 测试和 Kruskal 测试? [复制]