2016-04-05 16 views
1

私はこの解決策を知っていますが、提案された解決策は三方テーブルでは機能しません。3方向テーブルでpandasクロス集計を使用して行のパーセンテージを取得する方法は?

次の表検討:各topgroup内で、Iは、行パーセントを取得したいと思い、ここ

df = pd.DataFrame({'A' : ['one', 'one', 'two', 'three'] * 6, 
        'B' : ['A', 'B', 'C'] * 8, 
        'C' : ['foo', 'foo', 'foo', 'bar', 'bar', 'bar'] * 4}) 




pd.crosstab(df.A,[df.B,df.C],colnames=['topgroup','bottomgroup']) 
Out[89]: 
topgroup  A  B  C  
bottomgroup bar foo bar foo bar foo 
A         
one   2 2 2 2 2 2 
three   2 0 0 2 2 0 
two   0 2 2 0 0 2 

を(A、B及びC)。

%を合計する必要があるため、apply(lambda x: x/sum(),axis=1)を使用すると、各グループがの範囲内にあるため、失敗します。

アイデア?

+1

は 'このちょうど' CT/ct.sum(軸= 1、レベル= 0)ではないですか?ここで 'ct'はあなたの' crosstab'です – EdChum

答えて

2

私はあなたの質問を理解していれば、あなたが書くことができるようだ:

>>> table = pd.crosstab(df.A,[df.B,df.C], colnames=['topgroup','bottomgroup']) 
>>> table/table.sum(axis=1, level=0) 

topgroup  A   B   C  
bottomgroup bar foo bar foo bar foo 
A           
one   0.5 0.5 0.5 0.5 0.5 0.5 
three  1.0 0.0 0.0 1.0 1.0 0.0 
two   0.0 1.0 1.0 0.0 0.0 1.0 
+1

正確に同じ20秒前にコメントしました、私はこれが正しいと思います+1 – EdChum

+0

これは純粋なパンダの魔法です。私は一度それを見たらそれはとても分かりやすいようです。ありがとう。私はあなたのアイデアが他の人にはとても有用だと思います。 'level = 0'は私のテーブルが列によってマルチインデックス化されているからです。 –

+1

ありがとうEdChum。 @Noobie:そうです、 'axis = 1'は、各行に沿って操作を適用したいと言っています。マルチインデックスを持っている場合は、そのメソッドをそのマルチインデックスの特定のレベルに適用するために' level'引数を渡すことができます。 –

関連する問題