2017-03-03 103 views
20

之间的关系,我有以下大熊猫据帧Top15enter image description here使用.corr得到两列

我创建估计每人可引用的文件数量列:

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

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

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

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

谁能帮助我?

+0

我认为你是对的。但是,你能告诉我为什么'data.corr(method ='pearson')'只返回能源供应和能源供应之间的关系吗? –

+0

它没有。它应该返回给你一个2x2矩阵;你显示它的左上角。如果将'.corr'直接应用于数据框,它将返回所有成对相关;这就是为什么你在矩阵的对角线上观察1s(每列与自身完全相关)。看到我的编辑如下。 – Cleb

+1

如果您认为它已回答您的问题,请考虑[接受](http://meta.stackexchange.com/a/5235) – MaxU

回答

36

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

Top15['Citable docs per Capita'].corr(Top15['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 

在您显示图形,只有相关矩阵的左上角被表示(I假设)。

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

5

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

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

记住这正是你计算自己

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

我通过改变数据类型解决了这个问题。如果您看到“人均能源供应量”是一种数字类型,而“可用人均文档数”是一种对象类型。我使用astype将列转换为float。我有一些NP功能相同的问题:count_nonzerosum工作,而meanstd没有。