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

Python Dataframe使用groupby分组求corr返回全NaN值如何解决

问题原因

返回全NaN结果的核心诱因和你填充/删除NaN的操作无关,来自两个分组后的底层数据问题:

  1. 单组样本量不足:你整个数据集只有40行,如果CODE字段的唯一值数量较多,拆分后单个分组的行数可能≤2,皮尔逊相关系数计算要求至少2组以上有差异的有效值,样本量不满足要求时会直接返回NaN。
  2. 分组内列方差为0:如果某个CODE分组下的SURVIVAL列或对应特征列数值完全一致(比如某组所有SURVIVAL值都是1),方差为0会导致相关系数计算时分母为0,最终返回NaN。

全量计算时40行样本量足够、各列波动符合计算要求,因此可以得到正常结果。

解决方法

第一步:先排查分组样本分布

先执行代码确认每个CODE分组的行数,提前定位样本量不足的分组:

print(df['CODE'].value_counts())

如果存在单组行数≤2的情况,建议先合并样本量过小的CODE分组,再做后续计算。

第二步:调整相关系数计算逻辑

替换原有的corr()切片写法,改用corrwith直接计算各特征和SURVIVAL的相关系数,逻辑更稳定,还可以显式指定NaN处理规则:

# 按CODE分组,每组内计算所有数值列与SURVIVAL的皮尔逊相关系数
group_corr = df.groupby('CODE').apply(
    lambda x: x.corrwith(x['SURVIVAL'], numeric_only=True, dropna=True)
)

如果需要得到和原有写法一致的长表结构,可追加如下处理:

group_corr = group_corr.stack().reset_index()
group_corr.columns = ['CODE', 'feature', 'survival_corr']

特殊场景适配

如果你的SURVIVAL是分类变量(比如0/1代表是否存活),可以改用斯皮尔曼秩相关系数,降低对数据分布的要求:

group_corr = df.groupby('CODE').apply(
    lambda x: x.corrwith(x['SURVIVAL'], numeric_only=True, dropna=True, method='spearman')
)

内容的提问来源于stack exchange,提问作者Anna Shevtsova

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 08:24:09