因此,我瞭解到我可以使用DataFrame.groupby,而無需使用MultiIndex進行子採樣/橫截面。另一方面,當我在DataFrame上有一個MultiIndex時,我仍然需要使用DataFrame.groupby來完成子採樣/橫截面。熊貓多指標的好處?
那麼MultiIndex除了打印時相當有用和漂亮的顯示層次結構外,還有什麼好處呢?
因此,我瞭解到我可以使用DataFrame.groupby,而無需使用MultiIndex進行子採樣/橫截面。另一方面,當我在DataFrame上有一個MultiIndex時,我仍然需要使用DataFrame.groupby來完成子採樣/橫截面。熊貓多指標的好處?
那麼MultiIndex除了打印時相當有用和漂亮的顯示層次結構外,還有什麼好處呢?
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維數據結構。
one
用1
用數據-0.732470 -0.313871
。one
用2
用數據-0.031109 -2.068794
。one
與3
與數據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
3數據對在所述三維數據結構(第一描述'一個與1與數據-0.790620 0.229276 。......)似乎不符合你實際例子中的任何數據。 – Gerrat
當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']) –