2016-03-01 159 views
0

我想創建一個數據透視表並用於多個aggfuncs;特別是np.meannp.stdpandas.pivot_tables的正常行爲應該是將aggfuncs置於頂層。如果您只有value中的一列,這並不重要,但我有7個。這使得閱讀表格有點繁瑣。我希望能夠將值放在層次結構的頂部,以便每個value中都有一個平均值和標準列。有沒有辦法可以做到這一點,或者我可以解決嗎?大熊貓數據透視表排列

感謝您的幫助!

編輯:這裏是一小段數據摘錄。

Col1 Col2 Col3 Col4  Col5  Col6 Col7 Col8 Col9  
A  A  0  4247  5684  2068 393 237 16286 
A  A  0  0  2366  4159 3155 696 341  
A  B  18198 0  1114 1871 5392 1954 755 
A  B  17829 0  2695  2366 3768 1289 445 
A  C  18352 0  3545  7508 5099 2071 1239 

我所要的輸出是這樣的:

    Col 3  Col 4  Col 5  Col 6  Col 7 ... 
Col 1 Col 2 Mean Std Mean Std Mean Std Mean Std Mean Std ... 
A  A  0  0  2123.5 2173.5 ... 
     B  ... 
     C  ... 

我不打算通過所有Calcs(計算),現在運行,但我認爲,跨越,因爲這是一個格式化問題得到點。

+0

你可以做的是使用GROUPBY功能。這返回一個字典。然後使用字典的自定義打印方法。你可以.mean()和.std()方法。請顯示數據和所需的佈局。 – Merlin

+0

@merlin我添加了一些數據和所需的佈局 – Grr

+0

@Merlin剛回來審查它。確實如此。應該閱讀groupby文檔中的所有內容。謝謝! – Grr

回答

1

我不得不從「西1」 >>「Col1中」更改行標題

import pandas as pd 

df=pd.read_clipboard() 

df 

Col1 Col2 Col3 Col4  Col5  Col6 Col7 Col8 Col9  
A  A  0  4247  5684  2068 393 237 16286 
A  A  0  0  2366  4159 3155 696 341  
A  B  18198 0  1114 1871 5392 1954 755 
A  B  17829 0  2695  2366 3768 1289 445 
A  C  18352 0  3545  7508 5099 2071 1239 




    In [9]: import numpy as np 

In [10]: np.round(df.groupby(['Col1', 'Col2']).agg(['mean', 'std']),4) 
Out[10]: 
       Col3    Col4    Col5    Col6 \ 
       mean  std mean  std mean  std mean 
Col1 Col2 
A A   0.0 0.0000 2123.5 3003.0825 4025.0 2346.1803 3113.5 
    B  18013.5 260.9224  0.0  0.0000 1904.5 1117.9358 2118.5 
    C  18352.0  NaN  0.0  NaN 3545.0  NaN 7508.0 

         Col7    Col8    Col9 
       std mean  std mean  std mean   std 
Col1 Col2 
A A  1478.5603 1774 1953.0289 466.5 324.562 8313.5 11274.8176 
    B  350.0179 4580 1148.3414 1621.5 470.226 600.0 219.2031 
    C   NaN 5099  NaN 2071.0  NaN 1239.0   NaN 
0

我認爲這可以使用.describe()(它既有mean也有std stats)和.pivot的組合來解決。假設你有一個DF,看起來像這樣:

print(df) 

     City   Country     lon 
0  Dubai   United Arab Emirates 55.307484 
254  Buenos Aires Argentina    -58.381592 
1002 Rosario  Argentina    -60.666500 
1162 Punta Arenas Chile     -70.916473 
1178 San Miguel Argentina    -65.217590 

和你想對每個國家的「經度」列的統計信息。使用.describe獲得統計數據:

stats = df.groupby('Country').describe() 
#reset index so that you can specify the columns later 
stats.reset_index(level = [0,1], inplace = True) 
stats.head() 
    Country level_1 lon 
0 Albania count 1.0000 
1 Albania mean 19.8318 
2 Albania std  NaN 
3 Albania min  19.8318 
4 Albania 25%  19.8318 

然後根據您的統計表做一個數據透視表。因爲其結果將是多索引,你需要指定的元組列訪問均值和std列:

stats.pivot('Country', 'level_1')[[('lon', 'mean'), ('lon', 'std')]] 

結果會是這樣的:

lon 
level_1 mean std 
Country  
Albania 19.831800 NaN 
Algeria 2.744837 3.323134 
Angola 13.234444 NaN 
Argentina -63.806806 4.101027 

讓我知道,如果這有助於 - 祝你好運。

+0

我在使用我的格式時遇到了一些麻煩。當腳本進入'stats.pivot'時。在我的情況下,stats.head()沒有標籤的統計描述符列,它只是空白。所以我不知道如何在stats.pivot(index,columns)的'columns ='鍵中調用它。 – Grr

+0

這就是'reset_index'行的用途。基本上,當您運行.describe()函數時,它將stats列設置爲索引。因此,如果您的確如我的示例中所述,.reset_index(level = [0,1],inplace = True),那麼如果您的標記比我的原始DF更多/更少,它可能不起作用。我有兩個標記(國家和統計專欄),因此這兩個元素都是精髓。所以試着玩弄你放入關卡參數的數字。 – Sam

+0

我試着用stats.reset_index函數實現這一點,但現在我得到一個ValueError:長度不匹配。我想要的代碼是'stats。(col'1,'col 2'],'level_2')[column_tuples]'column_tuples是(col名,mean),(col名,std)元組的列表 – Grr