Skip to main content

Python Pandas: How to Add or Rename Column Names in Pandas

Setting descriptive column headers is essential for readable, maintainable DataFrames. Pandas provides several methods to define or modify column names at different stages of your workflow.

During DataFrame Creation - Best Practice

Specify columns when creating the DataFrame:

import pandas as pd

data = [['Alice', 25], ['Bob', 30]]
df = pd.DataFrame(data, columns=['Name', 'Age'])

print(df)

Output:

    Name  Age
0 Alice 25
1 Bob 30

From Different Data Sources

import pandas as pd

# From dictionary (keys become columns automatically)
df = pd.DataFrame({'Name': ['Alice', 'Bob'], 'Age': [25, 30]})

# From NumPy array
import numpy as np
arr = np.array([[1, 2], [3, 4]])
df = pd.DataFrame(arr, columns=['X', 'Y'])

# From CSV (often has headers, but can override)
df = pd.read_csv('data.csv', names=['Col1', 'Col2'], header=0)

Overwrite All Column Names

Replace all columns at once by assigning a list:

import pandas as pd

df = pd.DataFrame([[1, 2, 3], [4, 5, 6]])
print(f"Before: {list(df.columns)}")

df.columns = ['A', 'B', 'C']
print(f"After: {list(df.columns)}")

Output:

Before: [0, 1, 2]
After: ['A', 'B', 'C']
warning

The list length must exactly match the number of columns, or Pandas raises a ValueError.

Rename Specific Columns

Use rename() with a dictionary to change selected columns:

import pandas as pd

df = pd.DataFrame({'A': [1, 2], 'B': [3, 4], 'C': [5, 6]})

# Rename only 'A' and 'B'
df = df.rename(columns={'A': 'Alpha', 'B': 'Beta'})

print(df.columns.tolist())

Output:

['Alpha', 'Beta', 'C']

In-Place Renaming

import pandas as pd

df = pd.DataFrame({'old_name': [1, 2]})

# Modify without reassignment
df.rename(columns={'old_name': 'new_name'}, inplace=True)

print(df)

Output:

   new_name
0 1
1 2

Add Prefix or Suffix

Bulk-modify all column names:

import pandas as pd

df = pd.DataFrame({'A': [1], 'B': [2], 'C': [3]})

# Add prefix
df_prefixed = df.add_prefix('data_')
print(df_prefixed.columns.tolist())

# Add suffix
df_suffixed = df.add_suffix('_v1')
print(df_suffixed.columns.tolist())

Output:

['data_A', 'data_B', 'data_C']
['A_v1', 'B_v1', 'C_v1']

Practical Use Case

import pandas as pd

# Merge two DataFrames with same column names
sales_2023 = pd.DataFrame({'Revenue': [100], 'Profit': [20]})
sales_2024 = pd.DataFrame({'Revenue': [150], 'Profit': [35]})

# Distinguish with suffixes
combined = sales_2023.add_suffix('_2023').join(
sales_2024.add_suffix('_2024')
)
print(combined.columns.tolist())

Output:

['Revenue_2023', 'Profit_2023', 'Revenue_2024', 'Profit_2024']

Transform Column Names

Apply functions to modify names:

import pandas as pd

df = pd.DataFrame({'First Name': [1], 'Last Name': [2], 'EMAIL': [3]})

# Lowercase all
df.columns = df.columns.str.lower()
print(df.columns.tolist())

# Replace spaces with underscores
df.columns = df.columns.str.replace(' ', '_')
print(df.columns.tolist())

Output:

['first name', 'last name', 'email']
['first_name', 'last_name', 'email']

Using rename with a Function

import pandas as pd

df = pd.DataFrame({'col A': [1], 'col B': [2]})

# Apply transformation function
df = df.rename(columns=lambda x: x.upper().replace(' ', '_'))
print(df.columns.tolist())

Output:

['COL_A', 'COL_B']

Quick Reference

ScenarioMethod
New DataFramepd.DataFrame(data, columns=[...])
Replace all namesdf.columns = ['A', 'B', 'C']
Rename specificdf.rename(columns={'old': 'new'})
Add prefixdf.add_prefix('pre_')
Add suffixdf.add_suffix('_suf')
Transform namesdf.columns = df.columns.str.lower()

Summary

Set column names at DataFrame creation whenever possible-it's the cleanest approach.

  • Use df.columns = [...] to replace all names at once, or df.rename(columns={...}) for targeted changes.
  • For bulk modifications, add_prefix() and add_suffix() provide convenient shortcuts.