2013-06-10 13 views
5

マルチ・インデックスによるデータをグループ化する機会はありますか? これは、キーだけでなくキーと値をgroupby関数に渡すことによってデータフレーム列を事前定義することを意味しますか?パンダ・グループとマルチインデックス

a = np.array(['foo', 'foo', 'foo', 'bar', 'bar', 'foo', 'foo'], dtype=object) 
b = np.array(['one', 'one', 'two', 'one', 'two', 'two', 'two'], dtype=object) 
c = np.array(['dull', 'shiny', 'dull', 'dull', 'dull', 'shiny', 'shiny'], dtype=object) 
df = pd.DataFrame([a, b, c]).T 
df.columns = ['a', 'b', 'c'] 
df.groupby(['a', 'b', 'c']).apply(len) 

a b c  
bar one dull  1 
    two dull  1 
foo one dull  1 
      shiny 1 
    two dull  1 
      shiny 2 

しかし、私が実際にしたいことは以下の通りです:

mi = pd.MultiIndex(levels=[['foo', 'bar'], ['one', 'two'], ['dull', 'shiny']], 
        labels=[[0, 0, 0, 0, 1, 1, 1, 1], [0, 0, 1, 1, 0, 0, 1, 1], [0, 1, 0, 1, 0, 1, 0, 1]]) 
#pseudocode 
df.groupby(['a', 'b', 'c'], multi_index = mi).apply(len) 
a b c  
bar one dull  1 
      shiny 0 
    two dull  1 
      shiny 0 
foo one dull  1 
      shiny 1 
    two dull  1 
      shiny 2 

私はそれを参照してください方法は、GROUPBYオブジェクトの追加ラッパーの作成です。それとも、この機能はパンダの哲学にうってつけで、パンダのライブラリに含めることができますか?

答えて

6

ちょうど再インデックスとfillna!

In [14]: df.groupby(['a', 'b', 'c']).size().reindex(index=mi).fillna(0) 
Out[14]: 
foo one dull  1 
      shiny 1 
    two dull  1 
      shiny 2 
bar one dull  1 
      shiny 0 
    two dull  1 
      shiny 0 
dtype: float64 
+0

私はこの....何を含めることができることは多分キーワード '' dropna = False''を(Trueに通常はデフォルトは)(あなたがここに持っているものである)、MIのためのすべての組み合わせを含めることだと思いこれと同じプロパティを持つ0.11.1:http://pandas.pydata.org/pandas-docs/dev/groupby.html#filtrationで紹介している新機能と似ています。 – Jeff

+0

thx、それはすばらしいです!私の最初の質問はクロス集計機能に関するものだったので、あなたはそれにも答えましたhttp://stackoverflow.com/questions/17003034/missing-data-in-pandas-crosstab – norecces

+0

は@Andy Haydenだった....しかし、np – Jeff