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:如何从具有多列的数据框中循环遍历每两列组合以进行聚类?的主要内容,如果未能解决你的问题,请参考以下文章