2017-08-23 62 views
1

我正在使用下面的代碼關聯兩個數據幀。基本上,從一個數據幀(a)中選擇一組列,並從另一個數據幀(b)中選擇一列。它完美的工作,除非我需要用spearman的選項來完成。我將不勝感激任何意見或想法。謝謝...Spearman與corrwith python的相關度

a.ix[:,800000:800010].corrwith(b.ix[:,0]) 

回答

3

考慮在你通過每列到一個函數,這裏的匿名lambda的數據幀apply使用pandas.Series.corr,並且每個配對與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 

Spearman相關

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) 
+0

是完美凍糕......其實,我還可以申請我的原始列選擇的數據幀...這將(a.ix [:,0:5])。apply(lambda col:col.corr(b.ix [:,0],method ='pearson'),axis = 0)。 .....謝謝!! – NYSom

+0

我剛剛意識到....是否有一種簡單的方法在這裏生成pvalues ...?而不必使用scipy.stats .......如果我必須使用scipy.stats,你有沒有機會知道,我如何才能應用相同的框架,你剛剛制定了......謝謝.. – NYSom

+0

是的,您將不得不使用'scipy.stats'來檢索pvalues。請參閱擴展答案,以獲取corr和p值以及每個系列的新值。此外,StackOverflow還有一種特殊的方式說[謝謝](https://meta.stackexchange.com/a/5235)。 – Parfait