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

我有以下熊猫数据帧 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()方法(皮尔逊相关性) :

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

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

482020 次浏览

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

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-查看 这篇文章的示例。

如果您想过滤高于或低于某个阈值的条目,可以选择 这个问题。 如果您想绘制相关系数的热图,您可以检查 这个答案,如果您随后遇到与重叠轴标签的问题,请检查 以下职位

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

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

记住这是你自己计算出来的列

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

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不工作。

当你称之为:

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 的 corr) :

single_value = correlation[0][1]

希望这个能帮上忙。

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

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

工作原理是这样的:

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'])

在相关性之前将“人均 Citable 文档”更改为数字可以解决这个问题。

    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')

下面的方法对我很有用。取相关矩阵,然后根据变量名进行筛选:

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']]

如果你想要一种快速的方法来查找和绘制所有列之间相对于一个列的相关性(在本例中是“人均能源供应量”) :

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
cor = []
plt.figure()
for i in data.columns:
try:
cor +=  [np.corrcoef(data[i], data['Energy Supply per Capita'])[0][1]]
plt.scatter(i, np.corrcoef(data[i], data['Energy Supply per Capita'])[0][1])
plt.axvline(x = i, color='k', linestyle='-',alpha=0.2)
except:
pass
plt.ylabel('correlation')
plt.xticks(rotation = 90)