84040


マルチインデックスなDataFrameから、最大値と、そのインデックスを取得するにはどうしたらよいでしょうか？  
最大値は、df.max(axis='columns', level='種別')で取得できそうなのですが、  
idxmaxは引数にlevelを指定できないようで、困っています。

以下の方法が思いついたのですが、どちらもパフォーマンスを損なう気がしています。

  1. stackして列数を減らしてidxmaxする。
  2. groupbyでlevel=0の列ごとに最大値を取得する。

他に良い方法がないか、教えていただけないでしょうか。

[code]

    import pandas as pd
    df = pd.DataFrame(
        data=[ [1099, 1000, 2099, 2000], [1199, 1100, 2100, 2199], [1200, 1299, 2200, 2299] ],
        index=[ '2021/01', '2021/02', '2021/03' ],
        columns=[ ['りんご', 'りんご', 'みかん', 'みかん'], ['有機', 'ハウス', '有機', 'ハウス'] ],
    )
    df = df.rename_axis('date', axis='index')
    df = df.rename_axis(['果物', '種別'], axis='columns')
    display(df)
    
    print('')
    print('↓↓↓ 期待する最大値算出結果（level=0の列の最大値と、その種別を取得したい。）')
    df_out = pd.DataFrame(
        data=[ [ 1099, '有機', 2099, '有機' ], [ 1199, '有機', 2199, 'ハウス' ], [ 1299, 'ハウス', 2299, 'ハウス' ] ],
        index=[ '2021/01', '2021/02', '2021/03' ],
        columns=[ ['りんご', 'りんご', 'みかん', 'みかん'], ['価格', '種別', '価格', '種別'] ],
    )
    display(df_out)
    
[/code]

[![画像の説明をここに入力](https://i.stack.imgur.com/tDONl.png)](https://i.stack.imgur.com/tDONl.png)


CC BY-SA 4.0
2021-12-09T04:00:37.800
84037
2021-12-09T08:20:45.003
2021-12-09T07:03:26.140
3060
48481
question
python pandas
マルチインデックスでidxmaxを利用する方法

[code]

    def aggregate_maximum(x):
      i = int(x[0] < x[1])
      return pd.Series((x[i], x.index[i][1]), index=('価格', '種別'))
    
    df_out = (
      df.groupby(level=0, sort=False, axis=1)
        .apply(lambda x: x.apply(aggregate_maximum, axis=1)))
    
    print(df_out)
    
    #
    果物         りんご         みかん        
              価格    種別   価格    種別
    date                                 
    2021/01   1099    有機   2099    有機
    2021/02   1199    有機   2199   ハウス
    2021/03   1299   ハウス  2299   ハウス
    
[/code]


CC BY-SA 4.0
2021-12-09T08:20:45.003
84040
2021-12-09T08:20:45.003
47127
84037
answer