
当使用pandas series的`corr()`方法计算相关性时,若返回nan,通常是由于两个series的索引未对齐所致。pandas在计算前会尝试基于索引进行对齐,若无共同索引则产生nan。解决方案是通过`set_axis`方法强制series索引对齐,以获得正确的相关性结果,这与numpy在处理数组时不考虑索引的行为形成对比。
在数据分析中,计算两个序列之间的相关性是一项常见操作。Pandas库提供了方便的Series.corr()方法,但在某些情况下,该方法可能出人意料地返回NaN(Not a Number),即使数据本身看起来是有效的。本文将深入探讨这一现象的根本原因,并提供一个标准的解决方案。
考虑以下两个Pandas Series对象s1和s2,它们包含数值数据:
import pandas as pd
import numpy as np
# 示例数据
s1 = pd.Series([-0.443538, -0.255012, -0.582948, -0.393485, 0.430831,
0.232216, -0.014269, -0.133158, 0.127162, -1.855860],
name='s1')
s2 = pd.Series([-0.650857, -0.135428, 0.039544, 0.241506, -0.793352,
-0.054500, 0.901152, -0.660474, 0.098551, 0.822022],
index=range(29160, 29170), name='s2')
print("Series s1:")
print(s1)
print("\nSeries s2:")
print(s2)输出如下:
Series s1: 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 Series s2: 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
当我们尝试计算s1和s2的相关性时:
s1.corr(s2)
结果却是nan。
然而,如果使用NumPy的corrcoef函数对这些序列的底层数值进行计算,可以得到一个有效的结果:
np.corrcoef(s1, s2)[0][1]
输出:-0.4918385039519204。
这表明数据本身是具有相关性的,问题出在Pandas的corr()方法上。
Pandas的核心设计理念之一是“索引对齐”。当对两个或多个Pandas对象(如Series或DataFrame)执行操作时,Pandas会尝试根据它们的索引进行自动对齐。如果两个对象的索引没有共同的标签,或者共同标签下的数据类型不匹配,Pandas会用NaN填充缺失值。
在上述例子中,s1的索引是默认的0到9,而s2的索引是29160到29169。这两个Series的索引完全不重叠,没有任何共同的标签。当s1.corr(s2)被调用时,Pandas会尝试将s2对齐到s1的索引上。由于没有共同的索引,对齐后的s2将全部是NaN。两个包含NaN的序列进行相关性计算,结果自然就是NaN。
NumPy的np.corrcoef函数则不同,它处理的是纯粹的数值数组,不考虑Pandas的索引信息。它直接将两个Series的底层数值数组作为输入,因此能够正确计算出相关性。
要解决这个问题,我们需要在计算相关性之前,确保两个Series的索引是匹配的。最直接的方法是强制其中一个Series使用另一个Series的索引。Pandas提供了set_axis()方法来修改Series的轴标签(即索引)。
我们可以将s2的索引设置为与s1相同的索引:
# 强制s2使用s1的索引
aligned_s2 = s2.set_axis(s1.index)
print("\nAligned s2:")
print(aligned_s2)
# 再次计算相关性
correlation_result = s1.corr(aligned_s2)
print(f"\nCorrelation after alignment: {correlation_result}")输出:
Aligned s2: 0 -0.650857 1 -0.135428 2 0.039544 3 0.241506 4 -0.793352 5 -0.054500 6 0.901152 7 -0.660474 8 0.098551 9 0.822022 Name: s2, dtype: float64 Correlation after alignment: -0.49183852303556697
现在,我们得到了一个与NumPy结果非常接近的有效相关性值。
理解Pandas的索引对齐机制对于高效和准确地进行数据分析至关重要。通过正确处理索引,可以避免许多常见的陷阱,并确保你的计算结果是可靠的。
以上就是解决Pandas Series.corr返回NaN:深入理解索引对齐问题的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号