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

pandas计算列间Spearman秩相关返回NaN问题求解

问题原因
  • 代码中传入spearmanr的df.iteritems()是迭代器对象,并非实际的列数据,函数无法读取到有效数值,因此返回NaN。
  • 循环逻辑存在根本错误:循环过程中没有指定参与计算的两个具体列,每次传入的都是未遍历的全新迭代器,完全没有实现两两组队计算列相关性的逻辑。
  • 若数据中存在非数值类型列、缺失值,也会导致相关系数计算结果为NaN,计算前需要先做数据清洗。
实现方案

方案1:仅需相关系数矩阵(推荐)

pandas内置了Spearman秩相关的计算实现,无需手动编写循环,一行代码即可生成135×135的相关结果DataFrame,运行效率远高于手动调用scipy循环计算:

import pandas as pd
import numpy as np

# 读取数据
overview = pd.read_excel(r'overview_20062022.xlsx')
# 替换为实际需要计算的列名列表
df = overview[['all the column names']]

# 数据预处理:筛选数值列、处理缺失值,可根据业务需求调整缺失值处理逻辑
df = df.select_dtypes(include=[np.number]).dropna()

# 计算两两列的Spearman相关系数矩阵
spearman_corr_df = df.corr(method='spearman')

方案2:需要同时获取相关系数和p值矩阵

如果需要显著性检验的p值结果,可以通过双重循环配对计算,初始化两个DataFrame分别存储系数和p值:

from scipy.stats import spearmanr

cols = df.columns
# 初始化存储矩阵
corr_df = pd.DataFrame(index=cols, columns=cols, dtype=np.float64)
pval_df = pd.DataFrame(index=cols, columns=cols, dtype=np.float64)

# 两两配对计算
for i in range(len(cols)):
    for j in range(i, len(cols)):
        col1, col2 = cols[i], cols[j]
        coef, p = spearmanr(df[col1], df[col2])
        # 相关矩阵是对称的,对称位置赋值减少重复计算
        corr_df.loc[col1, col2] = coef
        corr_df.loc[col2, col1] = coef
        pval_df.loc[col1, col2] = p
        pval_df.loc[col2, col1] = p

# 显著性判断示例
alpha = 0.05
for col1 in cols:
    for col2 in cols:
        if col1 == col2:
            continue
        c = corr_df.loc[col1, col2]
        p = pval_df.loc[col1, col2]
        print(f'Spearmans correlation coefficient between {col1} and {col2}: %.3f' % c)
        if p > alpha:
            print('Samples are uncorrelated (fail to reject H0) p=%.3f' % p)
        else:
            print('Samples are correlated (reject H0) p=%.3f' % p)
注意事项
  • 135列的规模下,pandas内置corr方法的计算速度比scipy双重循环快数倍,无p值需求时优先使用内置方法。
  • 缺失值处理不要直接套用dropna(),可根据数据实际情况选择填充、成对删除等逻辑,避免样本量损失过多。

内容的提问来源于stack exchange,提问作者Lieke Pullen

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 14:45:43