2017-08-31 139 views
1

我有一個包含兩個類別字段和一個計數值的表。我需要根據其他類別的計數來計算一個類別的行之間的相關性。pandas:計算表間行間的相關度

因此,例如:

Category_A|Category_B|Count 
Alan  |Turkey |7 
Alan  |Ham  |1 
Alan  |Spam  |0 
... 
Bob  |Turkey |2 
Bob  |Ham  |9 
Bob  |Spam  |12 
... 

我需要獲得皮爾遜與p值相關的表是這樣的:

Category_A_1|Category_A_2|Correlation|P Value 
Alan  |Bob   |0.7  |0.07 

我無法弄清楚如何在大熊貓做到這一點。請幫忙。謝謝!

回答

3
corrs = df.pivot('Category_A','Category_B').T.corr().stack() 
#Category_A Category_A 
#Alan  Alan   1.000000 
#   Bob   -0.986552 
#Bob   Alan   -0.986552 
#   Bob   1.000000 
corrs.index.names = 'A','B' 
corrs.reset_index() 
#  A  B   0 
#0 Alan Alan 1.000000 
#1 Alan Bob -0.986552 
#2 Bob Alan -0.986552 
#3 Bob Bob 1.000000 

不幸的是,Pandas沒有用於計算p值的工具。

+0

太謝謝你了!我不擅長熊貓,更多的是一個pyspark傢伙,這非常有幫助! – rjurney

+0

哦,獎勵積分......我該如何拉出索引並在答案表中獲取其列? – rjurney

+0

應用'.reset_index()'。 – DyZ

1

這可能不是「完美」的答案,就使用熊貓而言,但可以考慮使用statsmodels模塊,因爲它有一個可以給出相關係數的對象,以及相應的p-值。

只要你可以得到陣列的順序是正確的(使用GROUPBY,排序等),你可以得到的值:

d1 = [['Alan', 'Turkey', 7], 
     ['Alan', 'Ham', 1], 
     ['Alan', 'Spam', 0]] 

df1 = pd.DataFrame(d1, columns=["Category_A", 'Category_B', 'Count']) 

d2 = [['Bob', 'Turkey', 2], 
     ['Bob', 'Ham', 9], 
     ['Bob', 'Spam', 12]] 


df2 = pd.DataFrame(d2, columns=["Category_A", 'Category_B', 'Count']) 

# package import 
import statsmodels.api as sm 

# regression model 
model = sm.OLS(df2['Count'], df1['Count']) 

# get results 
results = model.fit() 

# pearson coefficient, and p-value 
r2, pvalue = results.rsquared, results.pvalues.values[0] 

OUT: (0.046200873362445494, 0.78505611578264101) 

有可能是一個更好的方式來做到這一點,但可以工作。

+0

這隻適用於如果矩陣中有兩行,則不適用於N行 – DyZ

+0

是的,這對所有行都不起作用。 – rjurney

1

萬一p_value事項:

import scipy.stats 
df = df.pivot('Category_A','Category_B').T 
n = len(df.volumns) 
res = pd.DataFrame(columns=['Category_A','Category_B','Corr','P_value']) 
for i in range(n): 
    for j in range(i+1,n): 
     pears = scipy.stats(df.iloc[:,i],df.iloc[:,j]) 
     res.loc[-1] = [df.columns[i],df.columns[j],pears[0],pears[1]] 
     res.index += 1