2016-12-23 76 views
1

我正在使用一個包含世界上15個國家/地區的人口數據的熊貓數據框Top15熊貓統計組中的NaN值

     Population 
Country       
China    1.367645e+09 
United States  3.176154e+08 
Japan    1.274094e+08 
United Kingdom  6.387097e+07 
Russian Federation 1.435000e+08 
Canada    3.523986e+07 
Germany    8.036970e+07 
India    1.276731e+09 
France    6.383735e+07 
South Korea   4.980543e+07 
Italy    5.990826e+07 
Spain    4.644340e+07 
Iran    7.707563e+07 
Australia   2.331602e+07 
Brazil    2.059153e+08 

現在我想看看這些數據的大陸方面的統計數據。所以我使用字典創建GROUPBY對象:

df = Top15.groupby(ContinentDict) 

其中:

ContinentDict = {'China':'Asia', 
       'United States':'North America', 
       'Japan':'Asia', 
       'United Kingdom':'Europe', 
       'Russian Federation':'Europe', 
       'Canada':'North America', 
       'Germany':'Europe', 
       'India':'Asia', 
       'France':'Europe', 
       'South Korea':'Asia', 
       'Italy':'Europe', 
       'Spain':'Europe', 
       'Iran':'Asia', 
       'Australia':'Australia', 
       'Brazil':'South America'} 

,然後我創建一個新的數據幀將包含各種統計信息:

new_df = pd.DataFrame({'size' : df.size().values, 'sum' : df.sum().values, 'mean' : df.mean().values, 'std' : df.std().values}, index = df.groups.keys()) 

我得到以下輸出:

     mean size   std   sum 
North America 5.797333e+08  5 6.790979e+08 2.898666e+09 
Asia   2.331602e+07  1   NaN 2.331602e+07 
South America 7.632161e+07  6 3.464767e+07 4.579297e+08 
Europe   1.764276e+08  2 1.996696e+08 3.528552e+08 
Australia  2.059153e+08  1   NaN 2.059153e+08 

正如您所看到的,在標準偏差列中,有兩個值爲NaN(適用於亞洲和澳大利亞)。

在此之後,我試圖尋找在各個值

df.std() 

,我也得到:

Asia    6.790979e+08 
    Australia     NaN 
    Europe   3.464767e+07 
    North America 1.996696e+08 
    South America    NaN 

Name: Population, dtype: float64 

現在亞洲是完全罰款和南美是不是!我的原始數據框中沒有任何NaN值。如何解釋這種奇怪的行爲以及如何解決這個問題?

+0

你可以添加'ContinentDict'嗎? – jezrael

+0

@jezrael:添加字典。 – Peaceful

+0

我剛纔意識到大陸的尺寸在最終輸出中也是錯誤的。 – Peaceful

回答

3

這不是獲取groupby統計信息的好方法。只需直接通過傳遞函數名稱的列表,以agg計算分組的對象的統計信息:

>>> d.groupby(ContinentDict).Population.agg(['size', 'mean', 'std', 'sum']) 
       size   mean   std   sum 
Asia    5 5.797333e+08 6.790979e+08 2.898666e+09 
Australia   1 2.331602e+07   NaN 2.331602e+07 
Europe   6 7.632161e+07 3.464767e+07 4.579297e+08 
North America  2 1.764276e+08 1.996697e+08 3.528553e+08 
South America  1 2.059153e+08   NaN 2.059153e+08 

(可以使用,因爲所有的功能,你使用的內置熊貓方法字符串等是特殊的套管如果。你想計算任何自定義函數,你會通過實際的函數對象。)

至於NaNs,那些發生在一個給定的大陸只有一個國家的地方。單個數字的樣本標準偏差未定義,pandas默認使用樣本標準偏差。 (你可以通過調用.std(ddof=0)得到總體標準,這會給你零這些情況。)

你之前在不同地方看到NaN的原因是你明確地通過.groups.keys()作爲索引。 .groups只是一個字典,所以它的.key()可能是任意的順序。發生的事情是,你從計算中獲得的結果,std等與你從字典中得到的關鍵字不同。沒有必要像你一樣分別計算各種彙總統計數據;你可以一次完成.agg,大熊貓會確保一切都符合你的要求。

+0

我仍然沒有得到如何在這個設置中得到零而不是NaN。我嘗試用'std(ddof = 0)'替換'std',但是會引發錯誤。 – Peaceful

+0

嘗試做'd.groupby(ContinentDict).Population.agg(['size','mean',lambda c:c.std(ddof = 0),'sum'])''。當你使用一個字符串時,沒有辦法傳遞參數,所以你必須通過一個函數來調用'std'和額外的'ddof'參數。這會給你的專欄一個不太有用的名字(「」),但你可以隨時重命名。 – BrenBarn