计算两个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
相关产品推荐
相关产品推荐

