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
| Scenario | Method |
|---|---|
| New DataFrame | pd.DataFrame(data, columns=[...]) |
| Replace all names | df.columns = ['A', 'B', 'C'] |
| Rename specific | df.rename(columns={'old': 'new'}) |
| Add prefix | df.add_prefix('pre_') |
| Add suffix | df.add_suffix('_suf') |
| Transform names | df.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, ordf.rename(columns={...})for targeted changes. - For bulk modifications,
add_prefix()andadd_suffix()provide convenient shortcuts.