如何用DataFrame的.corr()函数获取每个类别的Top3特征?解决NaN异常
问题解决:按类别筛选后corr()返回全NaN的原因及修复
问题根源
当你筛选出单个类别的数据时,target列的所有值都是同一个常数(比如筛选class=1时,target全为1)。皮尔逊相关系数的计算要求变量有非零方差,而常量的方差为0,导致无法计算相关系数,结果全为NaN。
正确实现方法
要计算每个特征与是否属于该类别的相关性,需为每个类别构建一个二元指示变量(1表示属于该类,0表示不属于),再计算特征与这个二元变量的相关系数。
修改后的代码示例:
import pandas as pd import numpy as np # 创建样本数据 np.random.seed(123) data = np.random.randn(1000, 9) target = np.random.choice([1, 2, 3], size=1000) df = pd.DataFrame(data, columns=[f'feature_{i}' for i in range(1,10)]) df['target'] = target classes = [1,2,3] top_features = 3 for cls in classes: print(f"类别{cls}的Top{top_features}特征:") # 构建二元指示变量:标记样本是否属于当前类别 df[f'is_class_{cls}'] = (df['target'] == cls).astype(int) # 计算特征与指示变量的相关系数(取绝对值)并排序 corr = df.corr()[f'is_class_{cls}'].abs().sort_values(ascending=False) # 取出前top_features个特征(排除指示变量本身) top_corr_features = corr.drop(f'is_class_{cls}').head(top_features) print(top_corr_features) # 清理临时生成的指示列 df.drop(f'is_class_{cls}', axis=1, inplace=True) print("\n")
代码说明
- 为每个类别创建
is_class_X列,用0/1标记样本归属,保证该列有非零方差,可正常计算相关系数。 - 计算所有特征与二元列的相关系数,取绝对值排序后,排除自身列即可得到该类别对应的TopN特征。
内容的提问来源于stack exchange,提问作者benjamin olise
相关产品推荐
相关产品推荐

