2016-12-22 11 views
2

私は以下の問題に直面しています。複数のインデックスを持つPandas div

df = pd.DataFrame(np.random.randint(2, 8, size = (8, 1))) 
df.index = pd.MultiIndex.from_tuples([(1990, 'Women','type_A'), (1990, 'Women','type_B'),(1990, 'Men','type_A'), (1990, 'Men','type_B'), 
(1991, 'Women','type_A'), (1991, 'Women','type_B'),(1991, 'Men','type_A'), (1991, 'Men','type_B')]) 
df.index.names = ['Year', 'Gender','Type'] 
df.columns = ['Total'] 

次のようになります:私はYearによって各TypeGenderのシェアを計算しようとしているが、私は見つかっていない

     Total 
Year Gender Type   
1990 Women type_A  5 
      type_B  7 
    Men type_A  6 
      type_B  2 
1991 Women type_A  2 
      type_B  6 
    Men type_A  3 
      type_B  5 

私は(ここでは3)複数のインデックスを持つデータフレームを持っていますSOFに関する明確な答え。私は、次のdf取得する必要があり、一日の終わりに:

     Share 
Year Gender Type   
1990 Women type_A 0.4166 
      type_B 0.5833 
    Men type_A 0.7500 
      type_B 0.2500 
1991 Women type_A 0.2500 
      type_B 0.7500 
    Men type_A 0.3750 
      type_B 0.6250 

通常は、私がdiv機能を使用してそれを行うだろうが、複数のインデックスと、ここで動作するようには思えません。誰かが同様の状況に直面していますか?前もって感謝します !

答えて

1

1つのオプションは、(あなたが乱数発生器のシードを設定しなかったので、結果は多少異なります)年と性別による和グループを計算して、合計で元のデータフレームを分割することです:

df/df.groupby(level=[0, 1]).transform('sum') 

enter image description here

+0

ありがとう、私はあなたを愛しています。レベル[0,1]はどういう意味ですか?インデックス0は年、インデックス1は性別のように共有を計算するためのインデックスを定義する場所ですか?さらに、 'df/df.groupby(level = [0、1])。sum()'が機能しないのはなぜですか? –

+0

'level' [0,1]はマルチインデックスのレベルを意味するので、マルチインデックスは合計3レベル、0と1はそれぞれ最初の2つのレベル' year'と 'Gender'を表します。 'groupby()。sum()'構文はデータフレームをより小さい次元に縮小するので、 'df/df.groupby(level = [0,1])。sum()'は機能しません。分割を失敗させる元のデータフレームと一致する。一方、 'transform'はデータフレームの形状を保持しますが、集約された値を生成します。 – Psidom

関連する問題