2012-11-05 61 views
30

因此,我瞭解到我可以使用DataFrame.groupby,而無需使用MultiIndex進行子採樣/橫截面。另一方面,當我在DataFrame上有一個MultiIndex時,我仍然需要使用DataFrame.groupby來完成子採樣/橫截面。熊貓多指標的好處?

那麼MultiIndex除了打印時相當有用和漂亮的顯示層次結構外,還有什麼好處呢?

回答

58

pandas 0.4版本中引入了分層索引(也稱爲「多層次」索引)。

這爲一些非常複雜的數據分析和操縱打開了大門,特別是處理更高維數據。實質上,它使您能夠有效地存儲和操作二維表格結構(DataFrame)中的任意高維數據。

想象構建使用MultiIndex這樣的數據幀: -

import pandas as pd 
import numpy as np 

np.arrays = [['one','one','one','two','two','two'],[1,2,3,1,2,3]] 

df = pd.DataFrame(np.random.randn(6,2),index=pd.MultiIndex.from_tuples(list(zip(*np.arrays))),columns=['A','B']) 

df # This is the dataframe we have generated 

      A   B 
one 1 -0.732470 -0.313871 
    2 -0.031109 -2.068794 
    3 1.520652 0.471764 
two 1 -0.101713 -1.204458 
    2 0.958008 -0.455419 
    3 -0.191702 -0.915983 

df簡直是兩個維度

df.ndim 

2 

的數據結構,但是我們可以想象,望着輸出,一個3維數據結構。

  • one1用數據-0.732470 -0.313871
  • one2用數據-0.031109 -2.068794
  • one3與數據1.520652 0.471764

A.k.a .:「有效地存儲和在2維表格結構操縱任意高維數據」

這不僅是一個「漂亮的顯示」。由於我們現在有一個分層索引,因此它具有便於檢索數據的好處。

例如。

In [44]: df.ix["one"] 
Out[44]: 
      A   B 
1 -0.732470 -0.313871 
2 -0.031109 -2.068794 
3 1.520652 0.471764 

將給我們一個新的數據框只爲屬於「一個」的數據組。

而且我們可以通過這樣進一步縮小我們的數據選擇: -

In [45]: df.ix["one"].ix[1] 
Out[45]: 
A -0.732470 
B -0.313871 
Name: 1 

和當然,如果我們想要一個特定的值,這裏有一個例子: -

In [46]: df.ix["one"].ix[1]["A"] 
Out[46]: -0.73247029752040727 

所以,如果我們有更多的索引(除了上面示例中顯示的兩個索引之外),我們基本上可以深入並選擇我們真正感興趣的數據集,而不需要groupby

我們甚至可以從我們的數據框中獲取橫截面(行或列)...

通過行: -

In [47]: df.xs('one') 
Out[47]: 
      A   B 
1 -0.732470 -0.313871 
2 -0.031109 -2.068794 
3 1.520652 0.471764 

通過列: -

In [48]: df.xs('B', axis=1) 
Out[48]: 
one 1 -0.313871 
    2 -2.068794 
    3 0.471764 
two 1 -1.204458 
    2 -0.455419 
    3 -0.915983 
Name: B 
+6

3數據對在所述三維數據結構(第一描述'一個與1與數據-0.790620 0.229276 。......)似乎不符合你實際例子中的任何數據。 – Gerrat

+0

當from_arrays方法可用時,是否有任何特殊原因使用MultiIndex.from_tuples(list(zip(* np.arrays)) ? df = pd.DataFrame(np.random.randn(6,2),index = pd.MultiIndex.from_arrays(np.arrays),列= [ 'A', 'B']) –