Renaming Columns
Learn to rename DataFrame columns using various methods
Renaming Columns
Rename Single Column
import pandas as pd
df = pd.DataFrame({
'name': ['John', 'Sarah', 'Mike'],
'sal': [50000, 60000, 55000],
'yrs': [3, 5, 4]
})
df_new = df.rename(columns={'sal': 'Salary'})
print(df_new)Output:
name Salary yrs
0 John 50000 3
1 Sarah 60000 5
2 Mike 55000 4
Original df unchanged.
Rename Multiple Columns
df_new = df.rename(columns={
'name': 'Name',
'sal': 'Salary',
'yrs': 'Years'
})
print(df_new)Rename in Place
df.rename(columns={'sal': 'Salary'}, inplace=True)
print(df)Modifies original DataFrame.
Rename All Columns
df.columns = ['Name', 'Salary', 'Years']
print(df)Must provide name for every column.
Using List
new_names = ['Employee_Name', 'Employee_Salary', 'Years_Experience']
df.columns = new_names
print(df)Convert to Lowercase
df.columns = df.columns.str.lower()
print(df)All column names become lowercase.
Convert to Uppercase
df.columns = df.columns.str.upper()
print(df)Replace Spaces
df = pd.DataFrame({
'First Name': ['John', 'Sarah'],
'Last Name': ['Doe', 'Smith']
})
df.columns = df.columns.str.replace(' ', '_')
print(df)Output: ['First_Name', 'Last_Name']
Strip Whitespace
df = pd.DataFrame({
' Name ': ['John'],
'Salary ': [50000]
})
df.columns = df.columns.str.strip()
print(df.columns.tolist())Removes leading/trailing spaces.
Practice Example
The scenario: Clean messy column names from CSV.
import pandas as pd
employees = pd.DataFrame({
'emp id': [101, 102, 103],
'First Name': ['John', 'Sarah', 'Mike'],
'LAST_NAME': ['Doe', 'Smith', 'Johnson'],
'Sal (USD)': [50000, 65000, 55000],
'yrs_exp': [3, 7, 4],
'dept ': ['Sales', 'IT', 'HR']
})
print("Original columns:")
print(employees.columns.tolist())
print()
print("Step 1: Strip whitespace:")
employees.columns = employees.columns.str.strip()
print(employees.columns.tolist())
print()
print("Step 2: Replace spaces with underscore:")
employees.columns = employees.columns.str.replace(' ', '_')
print(employees.columns.tolist())
print()
print("Step 3: Convert to lowercase:")
employees.columns = employees.columns.str.lower()
print(employees.columns.tolist())
print()
print("Step 4: Clean specific names:")
employees = employees.rename(columns={
'emp_id': 'employee_id',
'sal_(usd)': 'salary',
'yrs_exp': 'years_experience',
'dept': 'department'
})
print(employees.columns.tolist())
print()
print("Final clean DataFrame:")
print(employees)Add Prefix
df = df.add_prefix('emp_')
print(df.columns.tolist())Output: ['emp_Name', 'emp_Salary', 'emp_Years']
Add Suffix
df = df.add_suffix('_2024')
print(df.columns.tolist())Output: ['Name_2024', 'Salary_2024', 'Years_2024']
Rename with Function
df = df.rename(columns=lambda x: x.upper())
print(df.columns.tolist())Applies function to each column name.
Custom function:
def clean_name(col):
return col.lower().replace(' ', '_')
df = df.rename(columns=clean_name)Rename by Position
df = pd.DataFrame([[1, 2, 3]], columns=['A', 'B', 'C'])
col_names = list(df.columns)
col_names[1] = 'NewB'
df.columns = col_names
print(df)Changes second column to 'NewB'.
Rename Index
Not columns, but rows.
df = df.rename(index={0: 'First', 1: 'Second'})
print(df)Snake Case Conversion
def to_snake_case(name):
import re
return re.sub(r'(?<!^)(?=[A-Z])', '_', name).lower()
df.columns = [to_snake_case(col) for col in df.columns]Converts 'FirstName' to 'first_name'.
Check Before Rename
if 'sal' in df.columns:
df = df.rename(columns={'sal': 'Salary'})Get Column Name Mapping
old_names = ['name', 'sal', 'yrs']
new_names = ['Name', 'Salary', 'Years']
rename_dict = dict(zip(old_names, new_names))
df = df.rename(columns=rename_dict)Rename Duplicate Columns
df = pd.DataFrame([[1, 2, 3]], columns=['A', 'A', 'B'])
cols = pd.Series(df.columns)
for dup in cols[cols.duplicated()].unique():
cols[cols == dup] = [dup + '_' + str(i) for i in range(sum(cols == dup))]
df.columns = cols
print(df.columns.tolist())Output: ['A_0', 'A_1', 'B']
Remove Special Characters
df.columns = df.columns.str.replace('[^a-zA-Z0-9_]', '', regex=True)
print(df.columns.tolist())Keeps only letters, numbers, underscores.
Standardize Format
def standardize(col):
col = col.strip()
col = col.lower()
col = col.replace(' ', '_')
col = col.replace('-', '_')
return col
df.columns = [standardize(col) for col in df.columns]Undo Rename
Save original names first.
original_columns = df.columns.tolist()
df.columns = ['A', 'B', 'C']
# Later restore
df.columns = original_columnsKey Points to Remember
rename(columns=dict) renames specific columns. Original unchanged unless inplace=True.
df.columns = list assigns new names to all columns at once.
str methods work on columns: .lower(), .upper(), .replace(), .strip().
add_prefix() and add_suffix() quickly add text to all column names.
Lambda functions and custom functions work with rename() for complex transformations.
Common Mistakes
Mistake 1: Wrong number of names
df.columns = ['A', 'B'] # Error if df has 3 columns!
# Must provide name for every columnMistake 2: Not assigning result
df.rename(columns={'sal': 'Salary'}) # Doesn't change df!
df = df.rename(columns={'sal': 'Salary'}) # Correct
# OR
df.rename(columns={'sal': 'Salary'}, inplace=True)Mistake 3: Renaming non-existent column
df.rename(columns={'Sallary': 'Salary'}) # No error, just ignored
print(df.columns.tolist()) # Check names firstMistake 4: Case sensitivity
df.rename(columns={'name': 'Name'}) # Won't work if column is 'Name'
# Column names are case-sensitive!Mistake 5: Forgetting str accessor
df.columns = df.columns.lower() # Error!
df.columns = df.columns.str.lower() # CorrectWhat's Next?
You now know how to rename columns. Next, you'll learn about working with indexes - setting, resetting, and using DataFrame indexes effectively.