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

计算两个Pandas Series相关系数得到NaN,用NumPy却正常,求原因?

问题:Pandas Series计算相关系数返回NaN,NumPy却能得到结果?

我有两个Pandas Series对象:

print(s1)
print("="*80)
print(s2)

输出:

0   -0.443538
1   -0.255012
2   -0.582948
3   -0.393485
4    0.430831
5    0.232216
6   -0.014269
7   -0.133158
8    0.127162
9   -1.855860
Name: s1, dtype: float64
================================================================================
29160   -0.650857
29161   -0.135428
29162    0.039544
29163    0.241506
29164   -0.793352
29165   -0.054500
29166    0.901152
29167   -0.660474
29168    0.098551
29169    0.822022
Name: s2, dtype: float64

用Pandas计算相关系数返回NaN:

s1.corr(s2)

输出:

nan

但用NumPy能得到正确结果:

np.corrcoef(s1,s2)[0][1]

输出:

-0.4918385039519204

请问上述代码是否存在错误?


解答

你的代码没有错误,出现差异的核心原因是Pandas和NumPy处理数据对齐的逻辑不同:

  • Pandas的corr()方法默认会按Series的索引对齐数据,只有索引完全匹配的位置才会被纳入计算。你的s1索引是0-9,s2索引是29160-29169,没有重叠的索引,因此没有可用于计算的匹配样本对,最终返回NaN。
  • NumPy的np.corrcoef()会直接忽略索引,将两个Series的数值视为独立的一维数组进行计算,因此能得到正确的相关系数。

解决方法

  • 方法一:忽略索引,直接用数值数组计算
    提取Series的底层数值数组传入corr方法:

    s1.corr(s2.values)
    

    或

    pd.Series(s1.values).corr(s2)
    
  • 方法二:重置索引对齐数据
    重置其中一个Series的索引,让两者索引一致:

    s2_reset = s2.reset_index(drop=True)
    s1.corr(s2_reset)
    
  • 方法三:继续使用NumPy的方法
    就是你已经用到的np.corrcoef(s1, s2)[0][1],结果同样正确。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 03:05:21