Python中使用corrwith计算Spearman相关系数

3

我正在使用以下代码对两个数据框进行关联。基本上,从一个数据框(a)中选择一组列和另一个数据框(b)中的一列。它完美地运行,但是我需要使用spearman选项来完成它。我会感激任何输入或想法。谢谢...

 a.ix[:,800000:800010].corrwith(b.ix[:,0])
1个回答

9
考虑在数据帧的 apply 中使用 pandas.Series.corr,其中您将每列传递到一个函数中,这里是匿名的 lambda,并将每个列与 b 列配对:

随机数据 (已种子化以重现)

import pandas as pd
import numpy as np

np.random.seed(50)

a = pd.DataFrame({'A':np.random.randn(50),
                  'B':np.random.randn(50),
                  'C':np.random.randn(50),
                  'D':np.random.randn(50),
                  'E':np.random.randn(50)})

b = pd.DataFrame({'test':np.random.randn(10)})

重现Pearson相关性

pear_result1 = a.ix[:,0:5].corrwith(b.ix[:,0])
print(pear_result1)
# A   -0.073506
# B   -0.098045
# C    0.166293
# D    0.123491
# E    0.348576
# dtype: float64

pear_result2 = a.apply(lambda col: col.corr(b.ix[:,0], method='pearson'), axis=0)
print(pear_result2)
# A   -0.073506
# B   -0.098045
# C    0.166293
# D    0.123491
# E    0.348576
# dtype: float64

print(pear_result1 == pear_result2)
# A    True
# B    True
# C    True
# D    True
# E    True
# dtype: bool

斯皮尔曼相关性

spr_result = a.apply(lambda col: col.corr(b.ix[:,0], method='spearman'), axis=0)
print(spr_result)
# A   -0.018182
# B   -0.103030
# C    0.321212
# D   -0.151515
# E    0.321212
# dtype: float64

斯皮尔曼相关系数和p值

from scipy.stats import spearmanr, pearsonr

# SERIES OF TUPLES (<scipy.stats.stats.SpearmanrResult> class)
spr_all_result = a.apply(lambda col: spearmanr(col, b.ix[:,0]), axis=0)

# SERIES OF FLOATS
spr_corr = a.apply(lambda col: spearmanr(col, b.ix[:,0])[0], axis=0)
spr_pvalues = a.apply(lambda col: spearmanr(col, b.ix[:,0])[1], axis=0)

1
这太完美了...事实上,我仍然可以对数据框应用我的原始列选择...使用您的示例,它将是这样的:(a.ix[:,0:5]).apply(lambda col: col.corr(b.ix[:,0], method='pearson'), axis=0)......谢谢! - NYSom
我刚刚意识到...有没有一种简单的方法在这里生成p值...?而不必使用scipy.stats......如果我必须使用scipy.stats,你知道吗,我怎么能将你刚刚解决的相同框架应用于...谢谢。 - NYSom
做得很好!... 谢谢你的双重支持。看起来我没有太多声望可以提高你的分数... 我已经检查过了! - NYSom

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接