85904


列がマルチインデックスなDataFrameへ、  
複数の列を、ループを利用せずに、まとめて追加することできないでしょうか？

参考にしたサイト：<https://www.fixes.pub/program/312227.html>

[code]

    import pandas as pd
    df = pd.DataFrame(
        data=[
            ['a', 10, 'あ', 11],
            ['b', 20, 'い', 21],
            ['c', 30, 'う', 31] ],
        index=['aa', 'bb', 'cc'],
        columns=[['X', 'X', 'Y', 'Y'], ['A', 'B', 'A', 'B']],
    )
    print('◇元データ')
    display(df)
    
    df_expected = pd.DataFrame(
        data=[
            ['a', 10, 1000, 'あ', 11, 1100],
            ['b', 20, 2000, 'い', 21, 2100],
            ['c', 30, 3000, 'う', 31, 3100] ],
        index=['aa', 'bb', 'cc'],
        columns=[['X', 'X', 'X', 'Y', 'Y', 'Y'], ['A', 'B', 'C', 'A', 'B', 'C']],
    )
    print('◇期待する変換結果')
    display(df_expected)
    
    print('↓↓↓[参考]値の変更ならまとめてできる')
    df.loc[:, (slice(None), 'B')] = df.loc[:, (slice(None), 'B')] * 100 # ←値の変更ならまとめてできる。
    display(df)
    
[/code]

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


CC BY-SA 4.0
2022-01-24T07:27:20.390
85901
2022-01-25T05:28:16.507
2022-01-24T08:15:13.083
3060
48481
question
python python3 pandas
マルチインデックスのDataFrameに、複数の列をまとめて追加する方法


`df['X', 'C'] = [1000, 2000, 3000]`のようにカラムを指定して追加できます。  
この方法では末尾に追加されるので、期待する変換結果にするには`sort_index`で整列が必要です。

参考資料: [Pandas: add a column to a multiindex column
dataframeの回答](https://stackoverflow.com/a/16089219)

[code]

    import pandas as pd
    df = pd.DataFrame(
        data=[
            ['a', 10, 'あ', 11],
            ['b', 20, 'い', 21],
            ['c', 30, 'う', 31] ],
        index=['aa', 'bb', 'cc'],
        columns=[['X', 'X', 'Y', 'Y'], ['A', 'B', 'A', 'B']],
    )
    
    # カラム追加
    df['X', 'C'] = [1000, 2000, 3000]
    #df['Y', 'C'] = [1100, 2100, 3100]
    df['Y', 'C'] = df['X', 'C'] + 100   # こんな書き方もできる
    df = df.sort_index(axis=1)
    
    print('◇元データ')
    print(df)
    
[/code]


CC BY-SA 4.0
2022-01-24T08:09:25.007
85902
2022-01-24T08:09:25.007
9820
85901
answer

[code]

    import pandas as pd
    import numpy as np
    
    print(pd.__version__)
    # 1.4.0
    
    df = pd.DataFrame(
        data=[
            ['a', 10, 'あ', 11],
            ['b', 20, 'い', 21],
            ['c', 30, 'う', 31] ],
        index=['aa', 'bb', 'cc'],
        columns=pd.MultiIndex.from_product([['X', 'Y'], ['A', 'B']]),
    )
    
    level = df.columns.get_level_values(0).unique()
    df[[(i, 'C') for i in level]] = np.array([[1000, 2000, 3000], [1100, 2100, 3100]]).T
    df = df[level]
    
    pd.set_option('display.unicode.east_asian_width', True)
    print(df)
    #
        X             Y          
        A   B     C   A   B     C
    aa  a  10  1000  あ  11  1100
    bb  b  20  2000  い  21  2100
    cc  c  30  3000  う  31  3100
    
[/code]


CC BY-SA 4.0
2022-01-24T09:34:53.600
85904
2022-01-24T09:47:40.230
2022-01-24T09:47:40.230
47127
47127
85901
answer


以下の２通りの方法で、列がマルチインデックスなDataFrameに、まとめて列が追加できること理解/確認できました。  
ありがとうございました。

方法①：df[ [列のtuple, 列のtuple, 列のtuple, ...] ] = 追加する列をまとめたデータフレーム  
方法②：df[ Level0列名, Level1列名, ... ] = 追加したいシリーズ  
さらに、df = df[level]や、df.sort_indexで、列の順番を整理すること。

pd.concat + df.sort_indexでもできました。勉強になりました。


CC BY-SA 4.0
2022-01-25T05:28:16.507
85921
2022-01-25T05:28:16.507
48481
85901
answer