如何在包含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
相关产品推荐
相关产品推荐

