如何在Pandas中按聚类分组后筛选每组中与目标变量相关性最高的特征
如何在Pandas中按聚类分组后筛选每组中与目标变量相关性最高的特征
看起来你已经顺利完成了特征聚类和目标相关性计算的前置步骤,接下来要从每个聚类里挑出和目标变量相关性最高的特征其实没那么复杂,用Pandas的groupby配合几个方法就能轻松搞定,下面给你几种实用的方案:
方法一:用groupby + idxmax()(最直接高效)
idxmax()方法会返回每个分组中指定列最大值对应的行索引,我们可以直接用这个索引从原DataFrame中提取目标行:
# 先确保相关性列是数值类型(避免排序/计算时出问题) clustered_features['corr_with_SOC'] = pd.to_numeric(clustered_features['corr_with_SOC']) # 获取每个cluster中corr_with_SOC最大的行的索引 top_feature_indices = clustered_features.groupby('cluster')['corr_with_SOC'].idxmax() # 根据索引提取对应的特征行,最后按cluster排序 top_features_per_cluster = clustered_features.loc[top_feature_indices].sort_values(by='cluster')
这样得到的top_features_per_cluster就是每个聚类里相关性最高的特征集合,结构和你原有的DataFrame保持一致,而且按聚类编号排好了序。
方法二:先排序再取每组第一行(贴合你原本的思路)
你之前提到了先按聚类和相关性排序的思路,那也可以顺着这个逻辑来:先把每个组内的特征按相关性从高到低排好,再直接取每组的第一行:
# 先按cluster升序、corr_with_SOC降序排序 sorted_features = clustered_features.sort_values( by=['cluster', 'corr_with_SOC'], ascending=[True, False] ) # 按cluster分组,取每组的第一行(也就是相关性最高的那个) top_features_per_cluster = sorted_features.groupby('cluster').first().reset_index()
这里的reset_index()是为了让cluster列从索引变回普通列,保持和原数据一致的结构,用起来更顺手。
补充:处理并列最大值的情况
如果你的数据里出现同一聚类中多个特征和目标的相关性完全相同(也就是最大值并列),上面两种方法只会保留第一个出现的特征。如果想要把所有并列的特征都保留,可以用transform配合布尔筛选:
# 计算每个聚类的最大相关性值,广播到每一行 max_corr_per_cluster = clustered_features.groupby('cluster')['corr_with_SOC'].transform('max') # 筛选出所有等于组内最大值的特征行 top_features_per_cluster = clustered_features[ clustered_features['corr_with_SOC'] == max_corr_per_cluster ].sort_values(by='cluster')
这种情况会把所有和组内最大值相等的特征都保留下来,适合需要考虑并列情况的场景。
你可以根据自己的实际数据情况选择合适的方法,测试一下就能知道哪种最贴合你的需求啦~
备注:内容来源于stack exchange,提问作者Orili
相关产品推荐
相关产品推荐

