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

ton*_*zhu 101 python correlation pandas

我有以下pandas数据帧Top15: 在此输入图像描述

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

Top15['PopEst'] = Top15['Energy Supply'] / Top15['Energy Supply per Capita']
Top15['Citable docs per Capita'] = Top15['Citable documents'] / Top15['PopEst']
Run Code Online (Sandbox Code Playgroud)

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

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

我想返回一个数字,但结果是: 在此输入图像描述

Cle*_*leb 169

没有实际数据很难回答这个问题,但我想你正在寻找这样的东西:

Top15['Citable docs per Capita'].corr(Top15['Energy Supply per Capita'])
Run Code Online (Sandbox Code Playgroud)

计算你的两列之间的相关性'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
Run Code Online (Sandbox Code Playgroud)

然后

df['A'].corr(df['B'])
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

命令

df['A'].corr(df['B'])
Run Code Online (Sandbox Code Playgroud)

回报

0.99586
Run Code Online (Sandbox Code Playgroud)

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

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

df.corr()
Run Code Online (Sandbox Code Playgroud)

因此会回来

          A         B
A  1.000000  0.995862
B  0.995862  1.000000
Run Code Online (Sandbox Code Playgroud)

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

有些情况下,您可以NaN在解决方案中找到答案 - 请查看此帖子以获取示例.

如果要过滤/低于特定阈值的条目,可以检查此问题.如果要绘制相关系数的热图,可以检查此答案,如果您遇到重叠轴标签的问题,请检查以下帖子.


小智 7

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

Top15[['Citable docs per Capita','Energy Supply per Capita']].corr()
Run Code Online (Sandbox Code Playgroud)


小智 6

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

Top15['Citable Documents per Person']=np.float64(Top15['Citable Documents per Person'])
Run Code Online (Sandbox Code Playgroud)

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


mgo*_*ser 5

如果您想要所有列对之间的相关性,您可以执行以下操作:

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')])
Run Code Online (Sandbox Code Playgroud)


小智 5

它是这样工作的:

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'])
Run Code Online (Sandbox Code Playgroud)