'Pandas pairwise rename columns for variable even number of dataframe columns

Example dataframe:

   0  1
0  1  3
1  2  4

Additional example dataframe:

   0  1  2  3
0  1  3  5  7
1  2  4  6  8

Expected result after pairwise renaming columns of above dataframes:

   Item 1 ID  Item 1 Title
0          1             3
1          2             4

   Item 1 ID  Item 1 Title  Item 2 ID  Item 2 Title
0          1             3          5             7
1          2             4          6             8

Renaming every dataframe column identically apart from incrementing iterator:

df.rename(columns={i: f'Item {i+1} ID' for i in df.columns})

Static dictionary mapping can't be used due to variable even number of dataframe columns.



Solution 1:[1]

IIUC, you can use a simple list comprehension:

df.columns = [f'Item {i+1} {x}' for i in range(len(df.columns)//2)
                                for x in ['ID', 'Title']]

output:

   Item 1 ID  Item 1 Title  Item 2 ID  Item 2 Title
0          1             3          5             7
1          2             4          6             8

If you need to rename in a pipeline, use:

def renamer(df):
    return df.set_axis([f'Item {i+1} {x}' for i in range(len(df.columns)//2)
                                          for x in ['ID', 'Title']],
                       axis=1)

df.pipe(renamer)

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1