85259


列がマルチインデックスなDataFrameの複数の列の値を、  
他の列の条件に合わせて変更する方法を教えていただけないでしょうか。  
それぞれのAA列、BB列の大小比較結果を新しい列に追加したいです。列方向は可変長を想定しています。  
slice(None)を利用して考えたのですが、うまくいきませんでした。  
df.loc[ (slice(None), 'AA') > (slice(None), 'BB'), (slice(None), 'out')] =
True #←うまくいかない

[code]

    # 入力データ
    print('入力データ（加工したいデータ）')
    df = pd.DataFrame(
        data=[ [1, 2, 3, 4], [40, 30, 20, 10] ],
        index=[ 'xx', 'yy' ],
        columns=[ ['りんご', 'りんご', 'みかん', 'みかん'], ['AA', 'BB', 'AA', 'BB'] ]
    )
    display(df)
    
    # 期待している出力結果
    print('出力データ（期待している結果）')
    df_expected = pd.DataFrame(
        data=[ [1, 2, False, 3, 4, False], [40, 30, True, 20, 10, True] ],
        index=[ 'xx', 'yy' ],
        columns=[ ['りんご', 'りんご', 'りんご', 'みかん', 'みかん', 'みかん'], ['AA', 'BB', 'out', 'AA', 'BB', 'out'] ]
    )
    display(df_expected)
    
    # 以下のような感じで、BB列の値より、AA列の値のほうが大きい行にTrueと印をつけたいです。
    # さらにすべての列に適用させたいです。
    # df = df['りんご'].copy()
    # df.loc[df['AA'] > df['BB'], 'out'] = True
    # df.loc[df['AA'] <= df['BB'], 'out'] = False
    # display(df)
    
[/code]

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


CC BY-SA 4.0
2021-12-21T12:05:25.267
85254
2021-12-21T16:06:10.583
2021-12-21T16:06:10.583
3060
35267
question
python python3 pandas
マルチインデックスの複数の列の値を、他の列の条件に基づき、一括で更新する方法


もっと少ない行数で簡潔に出来そうですが、取り敢えず以下のようにすれば出来るでしょう。

[pandas.DataFrame.groupby](https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.groupby.html)でトップレベルのインデックス('りんご',
'みかん')毎にDataFrameを取り出して、それぞれの`AA`と`BB`の列を比較して`out`の列を作成・代入し、そのDataFrameをリスト化して[pandas.concat](https://pandas.pydata.org/docs/reference/api/pandas.concat.html)で連結するという形になります。

[code]

    wf = []
    for item, grp in df.groupby(level=0, sort=False, axis=1):
        grp[item, 'out'] = (grp[item, 'AA'] > grp[item, 'BB'])
        wf.append(grp)
    
    df = pd.concat(wf, axis=1)
    
[/code]


CC BY-SA 4.0
2021-12-21T16:05:16.513
85259
2021-12-21T16:05:16.513
26370
85254
answer