You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 23:30:12