Use .corr to get the correlation between two columns
我有以下熊猫数据框
我创建了一个列来估计每个人的可引用文档数:
1 2 | Top15['PopEst'] = Top15['Energy Supply'] / Top15['Energy Supply per Capita'] Top15['Citable docs per Capita'] = Top15['Citable documents'] / Top15['PopEst'] |
我想知道人均可引用文件数量与人均能源供应之间的关系。所以我使用了
1 2 | data = Top15[['Citable docs per Capita','Energy Supply per Capita']] correlation = data.corr(method='pearson') |
我想返回一个数字,但结果是:
如果没有实际的数据,很难回答这个问题,但我想您正在寻找这样的问题:
1 | Top15['Citable docs per Capita'].corr(Top15['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 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,如预期的那样。
如果直接将
1 | df.corr() |
因此将返回
1 2 3 | A B A 1.000000 0.995862 B 0.995862 1.000000 |
在您展示的图形中,仅表示相关矩阵的左上角(我假设)。
有些情况下,您的解决方案中可能会有
如果要筛选高于/低于某个阈值的条目,可以检查此问题。如果你想绘制一个相关系数的热图,你可以检查这个答案,然后如果你遇到重叠轴标签的问题,检查下面的文章。
我也遇到了同样的问题。似乎
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函数也有同样的问题: