85241
上段のようなDataFrameから、列名を変更して下段のようにしたいです。  
行、列ともに件数が多く、可変長なため、  
可能であれば、一括して変更したいのですが、forループを利用せずに列名を一括して変更することはできないでしょうか？

```

    import io
    import pandas as pd
    
    # 変更前のDataFrame
    data = """\
    level_0,りんご,りんご,ミカン,ミカン
    level_1,2018,2019,2018,2019
    0,100,120,50,60
    1,105,125,51,61
    2,110,130,52,62
    """
    df = pd.read_csv(io.StringIO(data), index_col=0, header=[0,1])
    display(df)
    
    # 変更後のDataFrame（期待する結果）
    data = """\
    level_0,りんご,りんご,ミカン,ミカン
    level_1,2018,2022,2018,2022
    0,100,120,50,60
    1,105,125,51,61
    2,110,130,52,62
    """
    df = pd.read_csv(io.StringIO(data), index_col=0, header=[0,1])
    print('↓↓↓以下のように列名を一括して変更したいです。')
    display(df)
    
```

[![画像の説明をここに入力](https://i.stack.imgur.com/8AI7v.png)](https://i.stack.imgur.com/8AI7v.png)
CC BY-SA 4.0
2021-12-20T12:38:26.857
85239
2021-12-21T12:00:01.537
35267
question
python pandas
マルチインデックスの列名をまとめて変更する方法
この記事を適用して [pandas.MultiIndex.set_levels](https://pandas.pydata.org/pandas-
docs/stable/reference/api/pandas.MultiIndex.set_levels.html) を使えば出来るでしょう。  
[Rename MultiIndex columns in
Pandas](https://stackoverflow.com/q/41221079/9014308)

質問のDataFrameはlevel_1の値が同じものの繰り返しなのでこうなるのでは？

```

    df.columns.set_levels([2018,2022],level=1,inplace=True)
    
```

* * *

変更する元のデータをDataFrame自身から取ってくるには、以下が使えるでしょう。  
level_1が同じ値の繰り返しの時  
[pandas.MultiIndex.levels](https://pandas.pydata.org/pandas-
docs/stable/reference/api/pandas.MultiIndex.levels.html)

こんな風に：

```

    lv1name = list(df.columns.levels[1])
    
```

level_1がすべて別の値の時  
[pandas.MultiIndex.get_level_values](https://pandas.pydata.org/pandas-
docs/stable/reference/api/pandas.MultiIndex.get_level_values.html)

こんな風に：

```

    lv1name = list(df.columns.get_level_values('level_1'))
    
```
CC BY-SA 4.0
2021-12-20T13:35:42.257
85241
2021-12-20T13:35:42.257
26370
85239
answer
教えていただいた方法で、できました。ありがとうございました。

```

    import io
    import pandas as pd
    
    # 変更前のDataFrame
    data = """\
    level_0,りんご,りんご,ミカン,ミカン
    level_1,2018,2019,2018,2019
    0,100,120,50,60
    1,105,125,51,61
    2,110,130,52,62
    """
    df = pd.read_csv(io.StringIO(data), index_col=0, header=[0,1])
    display(df)
    
    level1_name_list = [ column_name.replace('2019', '2022') for column_name in df.columns.levels[1] ]
    df.columns = df.columns.set_levels(level1_name_list, level=1)
    display(df)
    
```
CC BY-SA 4.0
2021-12-21T12:00:01.537
85253
2021-12-21T12:00:01.537
35267
85239
answer