如何在Python中为K-Means分析后的DataFrame添加原数据列?
解决方法:给聚类结果DataFrame添加原始x、y列
当然可以实现这个需求!这其实是个很常见的操作,而且实现起来非常简单——因为你生成的sh_df和原始数据的每一行都是一一对应的,索引完全匹配,所以有几种轻松的方法可以把x、y列加进去:
方法一:创建sh_df时直接包含x、y列
最直接的方式就是在初始化sh_df的时候,把原始的x、y列一起放进DataFrame的字典里,一步到位:
sh_df = pd.DataFrame( { 'x': df2['x'], # 直接从df2取x列 'y': df2['y'], # 直接从df2取y列 'silhouette': silhouette_samples(df2, assignedClusters.labels_), 'cluster': assignedClusters.labels_ } )
方法二:用pd.concat合并现有sh_df和原始数据列
如果已经生成了原来的sh_df,不想重新创建,可以用pd.concat按列合并两个DataFrame(因为索引一致,会自动对应每一行):
# 先保留你原来生成sh_df的代码 sh_df = pd.DataFrame( { 'silhouette': silhouette_samples(df2, assignedClusters.labels_), 'cluster': assignedClusters.labels_ } ) # 合并df2(包含x、y)和sh_df sh_df = pd.concat([df2, sh_df], axis=1)
这里的axis=1参数表示按列合并,一定要加上,不然会变成按行拼接,结果就错了。
方法三:直接给sh_df新增列
还有一种更直观的方式,就是直接给sh_df赋值新增x、y列,Pandas会自动根据索引匹配对应行的数据:
# 先保留你原来生成sh_df的代码 sh_df = pd.DataFrame( { 'silhouette': silhouette_samples(df2, assignedClusters.labels_), 'cluster': assignedClusters.labels_ } ) # 直接添加x、y列 sh_df['x'] = df['x'] sh_df['y'] = df['y'] # 或者用df2也可以,因为df2就是df的x、y子集 # sh_df['x'] = df2['x'] # sh_df['y'] = df2['y']
完整示例代码
这里给你整理好整个流程的代码,你可以直接复制使用:
import pandas as pd import matplotlib.pyplot as plt import seaborn as sns from sklearn.cluster import KMeans from sklearn.metrics import silhouette_samples # 假设你的原始DataFrame df已经存在 df2 = df[['x','y']] k = KMeans(n_clusters=3) assignedClusters = k.fit(df2) # 用方法一创建包含x、y的sh_df sh_df = pd.DataFrame( { 'x': df2['x'], 'y': df2['y'], 'silhouette': silhouette_samples(df2, assignedClusters.labels_), 'cluster': assignedClusters.labels_ } ) # 查看结果的前几行 print(sh_df.head())
小提示
如果担心索引不匹配,可以先运行print(df2.index.equals(sh_df.index))验证一下,返回True就说明两行数据的索引完全对应,合并不会有问题——而K-Means生成的标签数量和原始数据行数是完全一致的,所以肯定是匹配的。
内容的提问来源于stack exchange,提问作者SANM2009
相关产品推荐
相关产品推荐

