pandas: Rename column/index names of DataFrame

Modified: | Tags: Python, pandas

You can rename (change) column and/or index names in a pandas.DataFrame by using the rename(), add_prefix(), add_suffix(), set_axis() methods or by directly updating the columns and/or index attributes.

Similarly, you can rename index names of a pandas.Series.

The set_index() method, which sets an existing column as the index, is also available. For more information, see the following article:

The sample code in this article uses pandas version 2.0.3. The following DataFrame is used as an example.

import pandas as pd

print(pd.__version__)
# 2.0.3

df = pd.DataFrame({'A': [11, 21, 31], 'B': [12, 22, 32], 'C': [13, 23, 33]},
                  index=['ONE', 'TWO', 'THREE'])
print(df)
#         A   B   C
# ONE    11  12  13
# TWO    21  22  23
# THREE  31  32  33

Rename column/index names: rename()

You can use the rename() method of DataFrame to change the column/index names individually.

Basic usage

Specify the original and new names in a dict like {original_name: new_name} for the columns and/or index arguments of the rename() method.

The columns argument is used for changing column names, and the index argument is used for changing index names. If you want to change either, you should specify only one of columns or index.

A new DataFrame is returned while the original DataFrame remains unchanged.

df_new = df.rename(columns={'A': 'Col_1'}, index={'ONE': 'Row_1'})
print(df_new)
#        Col_1   B   C
# Row_1     11  12  13
# TWO       21  22  23
# THREE     31  32  33

print(df)
#         A   B   C
# ONE    11  12  13
# TWO    21  22  23
# THREE  31  32  33

Alternatively, you can use the first argument mapper and the axis argument to determine whether to target row or column names. If axis is set to 0 or 'index', it targets the row names; if it is set to 1 or 'columns', it targets the column names. With this approach, you cannot change both row and column names simultaneously.

print(df.rename({'A': 'Col_1'}, axis='columns'))
#        Col_1   B   C
# ONE       11  12  13
# TWO       21  22  23
# THREE     31  32  33

Change multiple column/index names

You can change multiple column/index names at once by adding elements to dict.

print(df.rename(columns={'A': 'Col_1', 'C': 'Col_3'}))
#        Col_1   B  Col_3
# ONE       11  12     13
# TWO       21  22     23
# THREE     31  32     33

Update the original object: inplace

By default, the original DataFrame is not changed, and a new DataFrame is returned.

Setting the inplace argument to True changes the original DataFrame. In this case, no new DataFrame is returned, and the return value is None.

df_copy = df.copy()
df_copy.rename(columns={'A': 'Col_1'}, index={'ONE': 'Row_1'}, inplace=True)
print(df_copy)
#        Col_1   B   C
# Row_1     11  12  13
# TWO       21  22  23
# THREE     31  32  33

Rename with functions or lambda expressions

You can also specify functions (callable objects) in the index and columns arguments of the rename() method.

For example, you can apply functions to convert strings to either upper or lower case:

print(df.rename(columns=str.lower, index=str.title))
#         a   b   c
# One    11  12  13
# Two    21  22  23
# Three  31  32  33

You can also apply lambda expressions.

print(df.rename(columns=lambda s: s * 3, index=lambda s: s + '!!'))
#          AAA  BBB  CCC
# ONE!!     11   12   13
# TWO!!     21   22   23
# THREE!!   31   32   33

Add prefix/suffix to column names: add_prefix(), add_suffix()

The add_prefix() and add_suffix() methods add prefixes and suffixes to column names.

These methods add the specified string in the argument to either the beginning or the end of column names.

print(df.add_prefix('X_'))
#        X_A  X_B  X_C
# ONE     11   12   13
# TWO     21   22   23
# THREE   31   32   33

print(df.add_suffix('_X'))
#        A_X  B_X  C_X
# ONE     11   12   13
# TWO     21   22   23
# THREE   31   32   33

In version 2.0.0, the axis argument was added. If set to 0 or 'index', it targets the row names. If set to 1 or 'columns', it targets the column names. If omitted, it defaults to targeting the column names, as demonstrated in the previous example.

print(df.add_prefix('X_', axis=0))
#           A   B   C
# X_ONE    11  12  13
# X_TWO    21  22  23
# X_THREE  31  32  33

print(df.add_suffix('_X', axis='index'))
#           A   B   C
# ONE_X    11  12  13
# TWO_X    21  22  23
# THREE_X  31  32  33

Note that in versions prior to 2.0.0, add_prefix() and add_suffix() could only rename columns. To add prefixes or suffixes to the index, you could use the rename() method with a lambda expression in the index argument, as described above.

Additionally, add_prefix() and add_suffix() do not have the inplace argument. If you want to update the original object, overwrite it like df = df.add_prefix().

Rename all names

To change all names, use the set_axis() method or directly update the columns/index attributes.

set_axis()

You can change all column/index names using the set_axis() method of DataFrame.

Specify new column/index names for the first argument labels as a list-like object, such as a list or tuple.

Set the axis argument to 0 or 'index' to update index, and to 1 or 'columns' to update columns. If omitted, the index is updated by default.

print(df.set_axis(['Row_1', 'Row_2', 'Row_3'], axis=0))
#         A   B   C
# Row_1  11  12  13
# Row_2  21  22  23
# Row_3  31  32  33

print(df.set_axis(['Row_1', 'Row_2', 'Row_3'], axis='index'))
#         A   B   C
# Row_1  11  12  13
# Row_2  21  22  23
# Row_3  31  32  33

print(df.set_axis(['Col_1', 'Col_2', 'Col_3'], axis=1))
#        Col_1  Col_2  Col_3
# ONE       11     12     13
# TWO       21     22     23
# THREE     31     32     33

print(df.set_axis(['Col_1', 'Col_2', 'Col_3'], axis='columns'))
#        Col_1  Col_2  Col_3
# ONE       11     12     13
# TWO       21     22     23
# THREE     31     32     33

print(df.set_axis(['Row_1', 'Row_2', 'Row_3']))
#         A   B   C
# Row_1  11  12  13
# Row_2  21  22  23
# Row_3  31  32  33

Note that an error is raised if the size (number of elements) of the specified list does not match the number of rows or columns.

# print(df.set_axis(['Row_1', 'Row_2', 'Row_3', 'Row_4']))
# ValueError: Length mismatch: Expected axis has 3 elements, new values have 4 elements

By default, the original DataFrame remains unchanged, and a new DataFrame is returned. The inplace argument was deprecated in version 1.5.0. If you want to update the original DataFrame, the release notes recommend overwriting it by setting the copy argument to False.

df_copy = df.copy()
df_copy = df_copy.set_axis(['Row_1', 'Row_2', 'Row_3'], copy=False)
print(df_copy)
#         A   B   C
# Row_1  11  12  13
# Row_2  21  22  23
# Row_3  31  32  33

Update the columns/index attributes of pandas.DataFrame

You can also directly update the columns and index attributes of DataFrame.

You can assign lists and tuples to the columns and index attributes.

df.index = ['Row_1', 'Row_2', 'Row_3']
df.columns = ['Col_1', 'Col_2', 'Col_3']
print(df)
#        Col_1  Col_2  Col_3
# Row_1     11     12     13
# Row_2     21     22     23
# Row_3     31     32     33

Note that an error is raised if the size (number of elements) of the list does not match the number of rows or columns.

# df.index = ['Row_1', 'Row_2', 'Row_3', 'Row_4']
# ValueError: Length mismatch: Expected axis has 3 elements, new values have 4 elements

For pandas.Series

You can change the index name (index) of a Series using methods similar to those used for a DataFrame, as shown in the previous examples.

For example, create a Series as follows:

s = pd.Series([1, 2, 3], index=['ONE', 'TWO', 'THREE'])
print(s)
# ONE      1
# TWO      2
# THREE    3
# dtype: int64

rename()

print(s.rename({'ONE': 'a', 'THREE': 'c'}))
# a      1
# TWO    2
# c      3
# dtype: int64

print(s.rename(str.lower))
# one      1
# two      2
# three    3
# dtype: int64

add_prefix(), add_suffix()

print(s.add_prefix('X_'))
# X_ONE      1
# X_TWO      2
# X_THREE    3
# dtype: int64

print(s.add_suffix('_X'))
# ONE_X      1
# TWO_X      2
# THREE_X    3
# dtype: int64

set_axis()

print(s.set_axis(['a', 'b', 'c']))
# a    1
# b    2
# c    3
# dtype: int64

Update the index attributes of pandas.Series

s.index = ['A', 'B', 'C']
print(s)
# A    1
# B    2
# C    3
# dtype: int64

Related Categories

Related Articles