0

0

解决Pandas Series.corr返回NaN:深入理解索引对齐问题

碧海醫心

碧海醫心

发布时间:2025-11-20 11:30:02

|

274人浏览过

|

来源于php中文网

原创

解决Pandas Series.corr返回NaN:深入理解索引对齐问题

当使用pandas series的`corr()`方法计算相关性时,若返回nan,通常是由于两个series的索引未对齐所致。pandas在计算前会尝试基于索引进行对齐,若无共同索引则产生nan。解决方案是通过`set_axis`方法强制series索引对齐,以获得正确的相关性结果,这与numpy在处理数组时不考虑索引的行为形成对比。

在数据分析中,计算两个序列之间的相关性是一项常见操作。Pandas库提供了方便的Series.corr()方法,但在某些情况下,该方法可能出人意料地返回NaN(Not a Number),即使数据本身看起来是有效的。本文将深入探讨这一现象的根本原因,并提供一个标准的解决方案。

问题现象:Pandas Series.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 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的核心设计理念之一是“索引对齐”。当对两个或多个Pandas对象(如Series或DataFrame)执行操作时,Pandas会尝试根据它们的索引进行自动对齐。如果两个对象的索引没有共同的标签,或者共同标签下的数据类型不匹配,Pandas会用NaN填充缺失值。

Axiom
Axiom

Axiom是一个浏览器扩展,用于自动化重复任务和web抓取。

下载

在上述例子中,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的索引对齐是其强大功能之一,但也可能导致意外行为。 在执行跨Series/DataFrame操作时,始终要留意它们的索引是否匹配你的预期。
  • Series.corr()方法在计算前会尝试对齐Series的索引。 如果索引不重叠,对齐后的Series将包含大量NaN,从而导致相关性计算结果为NaN。
  • 使用set_axis()方法可以强制Series使用指定的索引。 这是解决索引不对齐导致corr()返回NaN的有效方法。请确保在进行此操作时,你确实希望将一个Series的数据与另一个Series的索引进行匹配。
  • NumPy的数组操作不考虑Pandas的索引。 如果你只需要计算底层数值的相关性,而不在意索引对齐,可以直接提取Series的.values属性并使用NumPy函数。

理解Pandas的索引对齐机制对于高效和准确地进行数据分析至关重要。通过正确处理索引,可以避免许多常见的陷阱,并确保你的计算结果是可靠的。

相关专题

更多
Python 时间序列分析与预测
Python 时间序列分析与预测

本专题专注讲解 Python 在时间序列数据处理与预测建模中的实战技巧,涵盖时间索引处理、周期性与趋势分解、平稳性检测、ARIMA/SARIMA 模型构建、预测误差评估,以及基于实际业务场景的时间序列项目实操,帮助学习者掌握从数据预处理到模型预测的完整时序分析能力。

54

2025.12.04

数据类型有哪几种
数据类型有哪几种

数据类型有整型、浮点型、字符型、字符串型、布尔型、数组、结构体和枚举等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

307

2023.10.31

php数据类型
php数据类型

本专题整合了php数据类型相关内容,阅读专题下面的文章了解更多详细内容。

222

2025.10.31

数据类型有哪几种
数据类型有哪几种

数据类型有整型、浮点型、字符型、字符串型、布尔型、数组、结构体和枚举等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

307

2023.10.31

php数据类型
php数据类型

本专题整合了php数据类型相关内容,阅读专题下面的文章了解更多详细内容。

222

2025.10.31

数据分析的方法
数据分析的方法

数据分析的方法有:对比分析法,分组分析法,预测分析法,漏斗分析法,AB测试分析法,象限分析法,公式拆解法,可行域分析法,二八分析法,假设性分析法。php中文网为大家带来了数据分析的相关知识、以及相关文章等内容。

469

2023.07.04

数据分析方法有哪几种
数据分析方法有哪几种

数据分析方法有:1、描述性统计分析;2、探索性数据分析;3、假设检验;4、回归分析;5、聚类分析。本专题为大家提供数据分析方法的相关的文章、下载、课程内容,供大家免费下载体验。

280

2023.08.07

网站建设功能有哪些
网站建设功能有哪些

网站建设功能包括信息发布、内容管理、用户管理、搜索引擎优化、网站安全、数据分析、网站推广、响应式设计、社交媒体整合和电子商务等功能。这些功能可以帮助网站管理员创建一个具有吸引力、可用性和商业价值的网站,实现网站的目标。

733

2023.10.16

C++ 高级模板编程与元编程
C++ 高级模板编程与元编程

本专题深入讲解 C++ 中的高级模板编程与元编程技术,涵盖模板特化、SFINAE、模板递归、类型萃取、编译时常量与计算、C++17 的折叠表达式与变长模板参数等。通过多个实际示例,帮助开发者掌握 如何利用 C++ 模板机制编写高效、可扩展的通用代码,并提升代码的灵活性与性能。

8

2026.01.23

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Excel 教程
Excel 教程

共162课时 | 13万人学习

SciPy 教程
SciPy 教程

共10课时 | 1.2万人学习

NumPy 教程
NumPy 教程

共44课时 | 3万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号