2017-03-03 100 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沒有。