2012-11-05 7 views
30

私は、MultiIndexを使わずにDataFrame.groupbyを使用して、サブサンプリング/クロスセクションを実行できることを学びました。パンダのマルチインデックスの利点?

一方、DataFrameにMultiIndexがある場合、DataFrame.groupbyを使用してサブサンプリング/クロスセクションを実行する必要があります。

それでは、印刷時の階層を非常に参考にしてきれいに表示するだけでなく、マルチインデックスはどのような点で優れていますか?

答えて

58

pandas 0.4リリースで階層索引(「マルチレベル」索引付けとも呼ばれる)が導入されました。

これは、特に高次元のデータを扱うために、非常に洗練されたデータ分析と操作の扉を開きます。基本的には、任意の高次元データを2次元の表構造(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は、単に2次元

df.ndim 

2 

のデータ構造である。しかし、我々は出力を見て、それを想像することができ、として3次元データ構造。データ-0.732470 -0.3138711

  • one
  • 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 

は、「1」に属するデータグループの新しいデータフレームのみを提供します。

そして、我々はこれを行うことにより、さらに私たちのデータ選択を絞り込むことができます: -

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を必要としません。

データフレームから断面(行または列のいずれか)を取得することもできます...列によって

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 '1 -0.790620 0.229276の最初の説明ではデータの3対の列により

。...)実際の例のデータには対応していないようです。 – 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)、columns = ['A'、 'B']) –