因此,我了解到可以使用DataFrame.groupby而不用使用MultiIndex进行子采样/横截面。
另一方面,当我在DataFrame上具有MultiIndex时,仍然需要使用DataFrame.groupby进行子采样/横截面。
那么,除了在打印时非常有用和漂亮地显示层次结构之外,MultiIndex有什么好处?
在pandas 0.4版本中引入了分级索引(也称为“多级”索引)。
这为一些非常复杂的数据分析和操作打开了大门,尤其是在处理高维数据时。本质上,例如,它使您能够有效地存储和处理二维表格结构(DataFrame)中的任意高维数据。
试想像这样构造一个数据框MultiIndex:
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
df.ndim 2
但是我们可以想象一下,将输出视为3维数据结构。
one
1
-0.732470 -0.313871
2
-0.031109 -2.068794
3
1.520652 0.471764
又名:“以二维表格结构有效存储和处理任意高维数据”
这不仅是“漂亮的展示”。由于我们现在有了一个层次索引,因此它具有易于检索数据的优点。
例如。
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
因此,如果我们有更多的索引(除了上面示例中显示的2个索引之外),我们基本上可以向下钻取并选择我们真正感兴趣的数据集,而无需groupby。
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