为什么Pandas和Numpy会产生与NaN成对相关的不同结果?

时间:2016-03-11 05:50:53

标签: python numpy pandas

我正在尝试为我正在构建的模型创建一个成对关联表,并且我的数据集中有一些numpy.nan值(NAN)。出于某种原因,当我使用np.corrcoef()执行相关时,我得到的结果与使用pd.df.corr()不同:

例如:

dataset = np.array([[1,np.nan,np.nan,1,1],[1,np.nan,np.nan,3000,1]])
pandas_data = pd.DataFrame(dataset.transpose())

print np.corrcoef(dataset)

我得到了:

[[ nan  nan]
[ nan  nan]]

但是使用pandas数据帧我有一个结果:

print pandas_data.corr()

    0   1
0 NaN NaN
1 NaN   1

他们处理NaN的方式有什么根本区别,或者我错过了什么? (另外,如果我有不同的值,为什么我的相关性为1?)谢谢

1 个答案:

答案 0 :(得分:1)

NumPy的默认行为是传播NaN。也就是说,它使用整个数组执行计算,每次将某些内容添加到NaN(或乘以等)时,结果为NaN。这是合理的:如果a = 5且b = NaN,则a + b应为NaN。因此,包含至少一个NaN的数组的方差是NaN,因此该数组与任何其他数组的相关性也是如此。

大熊猫的原始数据导向性质导致不同的设计决策:它试图从不完整的数据中提取尽可能多的信息。特别是,设计corr方法(和documented)以排除NaN。

要在NumPy中重现pandas行为,请使用如下的布尔掩码valid:它要求列中没有NaN值。

dataset = np.array([[1, 2, 3, 4, np.nan], [1, 0, np.nan, 8, 9]])

valid = ~np.isnan(dataset).any(axis=0)
numpy_corr = np.corrcoef(dataset[:, valid])

pandas_data = pd.DataFrame(dataset.transpose())    
pandas_corr = pandas_data.corr()

两种相关方法现在都返回相同的结果:

  [[ 1.        ,  0.90112711],
   [ 0.90112711,  1.        ]]) 

对角线条目表示数组与自身的相关性,它始终为1(理论上;实际上它在机器精度范围内为1)。