在 scipy/pandas 中用 Pearson 的 r 删除 'nan'

Posted

技术标签:

【中文标题】在 scipy/pandas 中用 Pearson 的 r 删除 \'nan\'【英文标题】:Dropping 'nan' with Pearson's r in scipy/pandas在 scipy/pandas 中用 Pearson 的 r 删除 'nan' 【发布时间】:2016-12-18 01:58:17 【问题描述】:

快速问题:有没有办法在 scipy 中将“dropna”与 Pearson 的 r 函数一起使用?我将它与熊猫一起使用,我的一些数据中有漏洞。我知道你以前可以在 older versions of scipy 中使用 Spearman 的 r 来抑制“nan”,但现在缺少该功能。

在我看来,这似乎是一种改进,所以我想知道我是否遗漏了一些明显的东西。

我的代码:

for i in range(len(frame3.columns)):    
    correlation.append(sp.pearsonr(frame3.iloc[ :,i], control['CONTROL']))

【问题讨论】:

是的,您可以为此使用dropna。你的问题是什么? 真的吗?每次我附加它时,我都会收到一个索引错误。我在上面添加了我的代码;放在哪里合适? "...现在缺少该功能。" 您指的是nan_policy 参数吗?那仍然在spearmanr。实际上,您称为“旧版本”的链接是最新版本 0.18.0 的文档。你用的是什么版本?通过运行import scipy; print(scipy.__version__) 进行检查 @WarrenWeckesser 我想他可能把 spearman 和 pearson 搞混了。 scipy.stats.pearsonr 没有nan_policy 【参考方案1】:

您也可以尝试创建临时数据帧,并使用 pandas 内置方法计算 pearson 相关性,或者在使用 sp.pearsonr 之前使用临时数据帧中的 .dropna 方法删除空值

for col in frame3.columns:    
     correlation.append(frame3[col].to_frame(name='3').join(control['CONTROL']).corr()['3']['CONTROL'])

【讨论】:

这是对加入的一些假设,例如:索引是兼容的【参考方案2】:

你可以像这样使用np.isnan

for i in range(len(frame3.columns)):    
    x, y = frame3.iloc[ :,i].values, control['CONTROL'].values
    nas = np.logical_or(x.isnan(), y.isnan())
    corr = sp.pearsonr(x[~nas], y[~nas])
    correlation.append(corr)

【讨论】:

我收到了错误AttributeError: 'numpy.ndarray' object has no attribute 'isnan' @SteveScott:试试x.isnan(),而不是np.isnan(x)

以上是关于在 scipy/pandas 中用 Pearson 的 r 删除 'nan'的主要内容,如果未能解决你的问题,请参考以下文章

python-数据处理的包Numpy,scipy,pandas,matplotlib

如何系统地学习Python 中 matplotlib,numpy,scipy,pandas

如何系统地学习Python 中 matplotlib,numpy,scipy,pandas

如何系统地学习Python 中 matplotlib,numpy,scipy,pandas

请问怎么安装Python的scipy,pandas,numpy这三个包啊?目前我的python版本是3.5.1。

Python之Pandas知识点