
当使用Pandas Series的`.corr()`方法计算相关性时,若结果为`NaN`,通常是由于两个Series的索引未对齐所致。Pandas在计算前会尝试基于索引进行对齐,导致不匹配的数据点被填充为`NaN`。本教程将深入探讨这一问题,并提供通过`set_axis`方法强制索引对齐的解决方案,同时提及`numpy.corrcoef`作为不依赖索引对齐的替代方案。
在数据分析中,计算两个序列之间的相关性是一项常见任务。Pandas库提供了方便的.corr()方法来执行此操作。然而,有时用户可能会遇到一个令人困惑的问题:即使输入序列包含有效数值,.corr()方法却返回NaN。本教程将深入剖析这一现象的根本原因,并提供切实可行的解决方案。
考虑以下两个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均包含10个浮点数,但它们的索引不同:s1 的索引是默认的 0 到 9,而 s2 的索引是从 29160 到 29169。
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 Series和DataFrame在执行二元操作(如加法、乘法、相关性计算等)时,默认会尝试根据它们的索引进行数据对齐。这意味着只有在两个对象中都存在相同索引标签的数据点才会被用于计算。如果索引标签不匹配,Pandas会用 NaN 填充缺失值。
在上述例子中,s1 的索引是 0, 1, ..., 9,而 s2 的索引是 29160, 29161, ..., 29169。这两个Series的索引标签完全没有重叠。当 s1.corr(s2) 被调用时,Pandas会尝试将 s2 的数据对齐到 s1 的索引上。由于 s1 的任何索引在 s2 中都不存在,反之亦然,对齐后的结果将是一个全部由 NaN 组成的Series。对一个包含 NaN 的Series计算相关性,通常会返回 NaN。
相比之下,numpy.corrcoef 函数直接操作输入的数组值,它不关心Pandas的索引信息。它将 s1 和 s2 视为两个独立的数值数组,并直接计算它们之间的相关性,因此能够得到正确的结果。这是因为NumPy是基于数组的库,不具备Pandas的索引概念。
解决Pandas corr() 返回 NaN 的问题,关键在于确保参与计算的两个Series拥有相同的索引。我们可以使用 pandas.Series.set_axis() 方法来强制一个Series采用另一个Series的索引。
例如,我们可以让 s2 采用 s1 的索引:
s1.corr(s2.set_axis(s1.index))
执行上述代码后,我们将得到正确的相关性值:
-0.49183852303556697
代码解析:
通过这种方式,我们显式地解决了索引不匹配的问题,使得Pandas能够找到对应的数据点进行计算。
当Pandas Series的.corr()方法返回 NaN 时,几乎总是由于两个Series的索引未对齐造成的。Pandas的索引对齐机制是其强大功能之一,但也可能在不熟悉其行为时导致意外结果。通过使用 s2.set_axis(s1.index) 这样的方法显式地对齐索引,或者直接利用 numpy.corrcoef 函数绕过Pandas的索引机制,可以有效地解决这个问题。理解并掌握Pandas的索引对齐原则,是高效、准确地进行数据分析的关键。
以上就是解决Pandas Series相关性计算中的NaN问题:索引对齐的艺术的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号