pandas:计算表行之间的相关性

时间:2017-08-31 23:10:47

标签: python pandas statistics correlation pearson-correlation

我有一个包含两个类别字段和一个计数的值表。我需要根据其他类别的计数来计算一个类别的行之间的相关性。

例如:

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

我需要在这样的表中得到Pearson与p值的相关性:

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

我无法弄清楚如何在熊猫中做到这一点。请帮忙。谢谢!

3 个答案:

答案 0 :(得分: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值的工具。

答案 1 :(得分:1)

这可能不是"完美"回答,就使用Pandas而言,您可以考虑使用statsmodels模块,因为它有一个OLS对象,可以同时给出相关系数以及相应的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)

这可能是更好的方法,但可以奏效。

答案 2 :(得分: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