2012-11-05 64 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']) –