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

如何在包含NaN值的Pandas DataFrame中计算相关性?

如何在含NaN值的Pandas DataFrame中计算相关性

当然可以!你提到的DataFrame.corr()默认会在计算两两列的相关性时,忽略那些对应位置包含NaN的样本对,但它并不会直接移除整个列——可能是你误解了它的行为~ 下面给你几种实用的处理方式,让你不用丢掉带NaN的列也能算出相关性:

1. 调整缺失值处理规则(Pandas 1.1.0+)

从Pandas 1.1.0版本开始,corr()新增了dropna参数,默认值是'any'(只要一对样本里有一个NaN就跳过)。如果你想放宽规则,只有当某对样本的两个值全是NaN时才忽略,可以设置dropna='all':

import pandas as pd
import numpy as np

# 构造带NaN的测试数据
df = pd.DataFrame({
    'A': [1, 2, np.nan, 4, 5],
    'B': [2, np.nan, 3, 4, 5],
    'C': [np.nan, 2, 3, 4, 5]
})

# 用宽松的缺失值规则计算相关性
corr_matrix = df.corr(dropna='all')
print(corr_matrix)

2. 理解默认的Pairwise删除逻辑

其实corr()默认的行为是成对删除缺失值:计算列A和列B的相关性时,只排除这两列对应行都有NaN的样本,其他行只要有一个有效值就会被用上。也就是说,默认情况下没有列会被移除,只是不同列对的有效样本数可能不一样。

3. 填充缺失值后计算

如果希望用所有样本参与计算,你可以先对NaN值做填充处理,比如用列的均值、中位数,或者其他业务逻辑的填充值,再计算相关性:

# 用列均值填充NaN
df_filled_mean = df.fillna(df.mean())
corr_mean = df_filled_mean.corr()

# 用列中位数填充NaN
df_filled_median = df.fillna(df.median())
corr_median = df_filled_median.corr()

4. 非参数相关系数的NaN处理

如果你的数据适合用非线性相关分析(比如Spearman或Kendall系数),这些方法同样支持自动忽略NaN样本对,直接调用即可:

# 计算Spearman秩相关系数
corr_spearman = df.corr(method='spearman')

# 计算Kendall tau相关系数
corr_kendall = df.corr(method='kendall')

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 06:59:30