如何在Pandas中检测特征重复并移除重复特征?
处理重复特征并明确重复关系的解决方案
我来帮你搞定这个重复特征处理的问题,同时针对你提到的「特征超过100个时seaborn热图难以阅读」的痛点,给出更高效的替代方案。
一、精准识别并移除完全重复的特征
首先,我们可以直接检查哪些特征的取值完全一致(比看相关性更直接,毕竟完全重复的列相关系数为1,但相关系数为1不一定是完全重复),然后保留每组重复特征中的一个,同时输出明确的重复关系:
import pandas as pd # 构造你的示例数据集 data = { 'Id': [1, 2], 'feature1': [4, 5], 'feature2': [5, 6], 'feature3': [7, 8], 'feature4': [7, 8], 'feature5': [5, 6], 'feature6': [5, 5] } df = pd.DataFrame(data) # 找出所有重复特征组 duplicate_groups = [] seen_columns = set() # 跳过Id列,只检查特征列 for col in df.columns[1:]: if col not in seen_columns: # 找到所有和当前列完全相同的列 matching_cols = df.columns[df.eq(df[col]).all()].tolist() if len(matching_cols) > 1: duplicate_groups.append(matching_cols) seen_columns.update(matching_cols) else: seen_columns.add(col) # 输出重复关系 print("重复特征对应关系:") for group in duplicate_groups: base_feature = group[0] duplicates = ", ".join(group[1:]) print(f"{base_feature} 与 {duplicates} 完全相同") # 构建去重后的数据集(保留每组第一个特征+非重复特征) keep_columns = ['Id'] + [group[0] for group in duplicate_groups] + [col for col in df.columns[1:] if col not in seen_columns] df_deduplicated = df[keep_columns] print("\n去重后的数据集:") print(df_deduplicated)
运行这段代码会得到你想要的结果:
重复特征对应关系:
feature2 与 feature5 完全相同
feature3 与 feature4 完全相同去重后的数据集:
Id feature1 feature2 feature3 feature6
0 1 4 5 7 5
1 2 5 6 8 5
二、替代seaborn heatmap处理大量特征的方案
当特征数量超过100时,热图会变得拥挤不堪,这里有两个更实用的方法:
方法1:直接提取高度相关(系数=1)的特征对
如果你的核心需求是找完全重复/线性相关的特征,可以直接从相关系数矩阵中筛选出值为1的特征对(排除自身对比):
corr_matrix = df.corr() # 找出相关系数=1的特征对(跳过自身) high_corr_pairs = [] for i in range(len(corr_matrix.columns)): for j in range(i+1, len(corr_matrix.columns)): if corr_matrix.iloc[i, j] == 1.0: high_corr_pairs.append((corr_matrix.columns[i], corr_matrix.columns[j])) print("高度相关(系数=1)的特征对:") for pair in high_corr_pairs: print(f"{pair[0]} ↔ {pair[1]}")
方法2:用聚类热图简化视图
如果还是想可视化,可以用seaborn的clustermap,它会自动将相似的特征聚类在一起,即使特征数量多,也能快速定位重复/高度相关的特征组:
import seaborn as sns import matplotlib.pyplot as plt # 生成聚类热图,调整尺寸适配大量特征 sns.clustermap(df.corr(), cmap='coolwarm', figsize=(12, 12)) plt.show()
重复的特征会被聚类到同一个分支,一眼就能识别出来。
内容的提问来源于stack exchange,提问作者Nabih Bawazir
相关产品推荐
相关产品推荐

