在 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