使用.corr获取两列之间的相关性

时间:2017-03-03 13:16:00

标签: python pandas correlation

我有以下pandas数据帧Top15:     enter image description here

我创建了一个列,用于估算每个人可引用文档的数量:

Top15['PopEst'] = Top15['Energy Supply'] / Top15['Energy Supply per Capita']
Top15['Citable docs per Capita'] = Top15['Citable documents'] / Top15['PopEst']

我想知道人均可引用文件数量与人均能源供应量之间的相关性。所以我使用.corr()方法(Pearson' s):

data = Top15[['Citable docs per Capita','Energy Supply per Capita']]
correlation = data.corr(method='pearson')

我想返回一个数字,但结果是: enter image description here

9 个答案:

答案 0 :(得分:139)

如果没有实际数据,很难回答这个问题,但我猜您正在寻找类似的东西:

Top15['Citable docs per Capita'].corr(Top15['Energy Supply per Capita'])

计算两列'Citable docs per Capita''Energy Supply per Capita'之间的相关性。

举个例子:

import pandas as pd

df = pd.DataFrame({'A': range(4), 'B': [2*i for i in range(4)]})

   A  B
0  0  0
1  1  2
2  2  4
3  3  6

然后

df['A'].corr(df['B'])

按预期提供1

现在,如果你改变一个值,例如

df.loc[2, 'B'] = 4.5

   A    B
0  0  0.0
1  1  2.0
2  2  4.5
3  3  6.0

命令

df['A'].corr(df['B'])

返回

0.99586

仍然接近1,正如预期的那样。

如果您将.corr直接应用于数据框,它将返回列之间的所有成对关联;这就是为什么你在矩阵的对角线上观察1s的原因(每列与自身完全相关)。

df.corr()
因此

将返回

          A         B
A  1.000000  0.995862
B  0.995862  1.000000

在您显示的图形中,仅表示相关矩阵的左上角(我假设)。

在某些情况下,您可以在解决方案中获得NaN - 请查看this post以获取示例。

如果您想过滤高于/低于特定阈值的条目,可以查看this question。 如果要绘制相关系数的热图,可以检查this answer,然后如果遇到重叠轴标签的问题,请检查the following post

答案 1 :(得分:6)

我遇到了同样的问题。 看来Citable Documents per Person是一个浮点数,python默认以某种方式跳过它。我的数据框的所有其他列都是numpy格式,所以我通过将columnt转换为np.float64

来解决它
Top15['Citable Documents per Person']=np.float64(Top15['Citable Documents per Person'])

请记住,这正是您自己计算的专栏

答案 2 :(得分:2)

当你这样称呼时:

data = Top15[['Citable docs per Capita','Energy Supply per Capita']]
correlation = data.corr(method='pearson')

由于DataFrame.corr()函数执行成对相关,因此您有两个变量中的四对。所以,基本上你得到对角线值作为自相关(与自身相关,两个值,因为你有两个变量),其他两个值作为一个与另一个的互相关,反之亦然。

在两个系列之间执行相关以获得单个值:

from scipy.stats.stats import pearsonr
docs_col = Top15['Citable docs per Capita'].values
energy_col = Top15['Energy Supply per Capita'].values
corr , _ = pearsonr(docs_col, energy_col)

,或者 如果你想要来自同一个函数的单个值(DataFrame' s corr):

single_value = correlation[0][1] 

希望这有帮助。

答案 3 :(得分:1)

如果你想要所有列对之间的相关性,你可以这样做:

import pandas as pd
import numpy as np

def get_corrs(df):
    col_correlations = df.corr()
    col_correlations.loc[:, :] = np.tril(col_correlations, k=-1)
    cor_pairs = col_correlations.stack()
    return cor_pairs.to_dict()

my_corrs = get_corrs(df)
# and the following line to retrieve the single correlation
print(my_corrs[('Citable docs per Capita','Energy Supply per Capita')])

答案 4 :(得分:1)

我的解决方案是将数据转换为数字类型之后

Top15[['Citable docs per Capita','Energy Supply per Capita']].corr()

答案 5 :(得分:1)

它是这样的:

Top15['Citable docs per Capita']=np.float64(Top15['Citable docs per Capita'])

Top15['Energy Supply per Capita']=np.float64(Top15['Energy Supply per Capita'])

Top15['Energy Supply per Capita'].corr(Top15['Citable docs per Capita'])

答案 6 :(得分:0)

我通过更改数据类型解决了这个问题。如果你看到'人均能源供应'是一种数字类型,而'人均可用文件'是一种对象类型。我使用astype将列转换为float。我遇到了一些与np函数相同的问题:count_nonzerosummeanstd没有的情况下有效。

答案 7 :(得分:0)

在关联之前将“人均引用文档”更改为数字即可解决问题。

    Top15['Citable docs per Capita'] = pd.to_numeric(Top15['Citable docs per Capita'])
    data = Top15[['Citable docs per Capita','Energy Supply per Capita']]
    correlation = data.corr(method='pearson')

答案 8 :(得分:0)

以下对我有用。取相关矩阵,然后根据变量名称过滤:

cor_df = df.corr()  # take the correlation from the data
cor_df.loc['Citable docs per Capita','Energy Supply per Capita'] # only single value

如果你把变量放在 [] 中,它也会返回变量名:

cor_df.loc[['Citable docs per Capita'],['Energy Supply per Capita']]