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

Use .corr to get the correlation between two columns

我有以下熊猫数据框Top15enter image description here

我创建了一个列来估计每个人的可引用文档数:

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

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

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

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


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

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

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

举个例子:

1
2
3
4
5
6
7
8
9
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

然后

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

按预期给予1

现在,如果您更改一个值,例如

1
2
3
4
5
6
7
df.loc[2, 'B'] = 4.5

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

命令

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

收益率

1
0.99586

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

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

1
df.corr()

因此将返回

1
2
3
          A         B
A  1.000000  0.995862
B  0.995862  1.000000

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

有些情况下,您的解决方案中可能会有NaNs—请查看本文中的示例。

如果要筛选高于/低于某个阈值的条目,可以检查此问题。如果你想绘制一个相关系数的热图,你可以检查这个答案,然后如果你遇到重叠轴标签的问题,检查下面的文章。


我也遇到了同样的问题。似乎Citable Documents per Person是一个float,而python默认情况下会跳过它。我的数据框架中的所有其他列都是numpy格式,所以我通过将columnt转换为np.float64来解决这个问题。

1
Top15['Citable Documents per Person']=np.float64(Top15['Citable Documents per Person'])

记住这正是你自己计算的列


工作原理如下:

1
2
3
4
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'])

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

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

当你称之为:

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

因为dataframe.corr()函数执行逐对关联,所以有两个变量中的四对。所以,基本上,你得到的是对角线值作为自相关(与自身相关,因为你有两个变量,所以有两个值),另外两个值作为一个和另一个的交叉相关,反之亦然。

在两个序列之间执行相关性以获取单个值:

1
2
3
4
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)

或者,如果要从同一个函数(数据帧的corr)获取单个值:

1
single_value = correlation[0][1]

希望这有帮助。


如果需要所有列对之间的关联,可以这样做:

1
2
3
4
5
6
7
8
9
10
11
12
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')])


我通过更改数据类型解决了这个问题。如果你看到"人均能源供应"是一个数字类型,"人均可引用文件"是一个对象类型。我使用astype将列转换为float。我对一些np函数也有同样的问题:count_nonzerosum工作,而meanstd不工作。