54393


今、以下のような DataFrame があるとします。

[code]

    import pandas as pd
    
    mi = pd.MultiIndex(
        levels=[['group1', 'group2'], [1,2,3,4]],
        codes=[[0,0,1,1], [0,1,2,3]],
        names=['group', 'id']
    )
    
    df = pd.DataFrame({
        'col1': [400, 300, 200, 100],
        'col2': [10, 20, 30, 40],
    }, index=mi)
    df
    
[/code]

[![displayed
df](https://i.stack.imgur.com/3jQrv.png)](https://i.stack.imgur.com/3jQrv.png)

これに対して、 idxmax をグループしながら実行したとします。

[code]

    max_idx = df.groupby(level='group').idxmax()
    max_idx
    
[/code]

[![displayed
max_idx](https://i.stack.imgur.com/5iAYA.png)](https://i.stack.imgur.com/5iAYA.png)

これらのデータから、以下のような DataFrame を作りたいです。

[code]

    pd.DataFrame({
        ('col1', 'col1'): [400, 200],
        ('col1', 'col2'): [10, 30],
        ('col2', 'col1'): [300, 20],
        ('col2', 'col2'): [100, 40]
    }, index=pd.Index(['group1', 'group2'], name='group')).rename_axis(['max_at', 'original_cols'], axis=1)
    
[/code]

[![wanted result of df referring idx by
idxmax](https://i.stack.imgur.com/5gE2X.png)](https://i.stack.imgur.com/5gE2X.png)

### 質問

最後の DataFrame を、 `df` と `max_idx` の DataFrame から導出するにはどうしたらよいでしょうか？


CC BY-SA 4.0
2019-04-22T03:27:16.487
54380
2019-04-22T09:46:48.350
754
question
python pandas
MultiIndex の idxmax の結果を元にDataFrame を横展開したい


やりたい事はこんな感じでしょうか

[code]

    import pandas as pd
    
    mi = pd.MultiIndex(
        levels=[['group1', 'group2'], [1,2,3,4]],
        codes=[[0,0,1,1], [0,1,2,3]],
        names=['group', 'id']
    )
    
    df = pd.DataFrame({
        'col1': [400, 300, 200, 100],
        'col2': [10, 20, 30, 40],
    }, index=mi)
    
    max_idx = df.groupby(level='group').idxmax()
    
    ret = max_idx.apply(lambda d:d.transform(lambda d:df.loc[d]).stack(), axis=1)
    print(ret)
    #       col1      col2
    #       col1 col2 col1 col2
    #group
    #group1  400   10  300   20
    #group2  200   30  100   40
    
[/code]


CC BY-SA 4.0
2019-04-22T09:46:48.350
54393
2019-04-22T09:46:48.350
24801
54380
answer