Article Categories
- All Categories
-
Data Structure
-
Networking
-
RDBMS
-
Operating System
-
Java
-
MS Excel
-
iOS
-
HTML
-
CSS
-
Android
-
Python
-
C Programming
-
C++
-
C#
-
MongoDB
-
MySQL
-
Javascript
-
PHP
-
Economics & Finance
Python – Drop a level from a multi-level column index in Pandas dataframe
Multi-level column indexes in Pandas DataFrames provide hierarchical structure for columns. To drop a level from a multi-level column index, use the columns.droplevel() method. This is useful when you want to simplify your DataFrame structure by removing redundant hierarchy levels.
Creating a Multi-Level Column Index
First, create a multi-level column index using MultiIndex.from_tuples() ?
import numpy as np
import pandas as pd
# Create multi-level column index
columns = pd.MultiIndex.from_tuples([
("Sales", "Q1", "Jan"),
("Sales", "Q1", "Feb"),
("Sales", "Q2", "Mar")
])
# Create multi-level row index
vehicles = ['car', 'car', 'car', 'bike', 'bike', 'bike']
values = ['A', 'B', 'C', 'A', 'B', 'C']
index_arrays = [np.array(vehicles), np.array(values)]
# Create DataFrame with multi-level columns and index
df = pd.DataFrame(np.random.randn(6, 3), index=index_arrays, columns=columns)
df.index.names = ['Vehicle', 'Type']
print("Original DataFrame with 3-level columns:")
print(df)
Original DataFrame with 3-level columns:
Sales
Q1 Q2
Jan Feb Mar
Vehicle Type
car A 0.52 -1.86 0.28
B -0.45 1.23 -0.67
C 1.45 -0.32 0.89
bike A -0.78 0.56 1.34
B 0.23 -1.45 0.67
C -0.89 0.78 -0.23
Dropping a Level from Column Index
Use droplevel() to remove the first level (index 0) from the column hierarchy ?
import numpy as np
import pandas as pd
# Create the same DataFrame
columns = pd.MultiIndex.from_tuples([
("Sales", "Q1", "Jan"),
("Sales", "Q1", "Feb"),
("Sales", "Q2", "Mar")
])
vehicles = ['car', 'car', 'car', 'bike', 'bike', 'bike']
values = ['A', 'B', 'C', 'A', 'B', 'C']
index_arrays = [np.array(vehicles), np.array(values)]
df = pd.DataFrame(np.random.randn(6, 3), index=index_arrays, columns=columns)
df.index.names = ['Vehicle', 'Type']
print("Before dropping level:")
print(df.columns)
# Drop the first level (index 0)
df.columns = df.columns.droplevel(0)
print("\nAfter dropping level 0:")
print(df.columns)
print("\nUpdated DataFrame:")
print(df)
Before dropping level:
MultiIndex([('Sales', 'Q1', 'Jan'),
('Sales', 'Q1', 'Feb'),
('Sales', 'Q2', 'Mar')],
)
After dropping level 0:
MultiIndex([('Q1', 'Jan'),
('Q1', 'Feb'),
('Q2', 'Mar')],
)
Updated DataFrame:
Q1 Q2
Jan Feb Mar
Vehicle Type
car A 0.52 -1.86 0.28
B -0.45 1.23 -0.67
C 1.45 -0.32 0.89
bike A -0.78 0.56 1.34
B 0.23 -1.45 0.67
C -0.89 0.78 -0.23
Dropping Different Levels
You can drop any level by specifying its index. Here's how to drop the middle level (index 1) ?
import numpy as np
import pandas as pd
# Recreate original DataFrame
columns = pd.MultiIndex.from_tuples([
("Sales", "Q1", "Jan"),
("Sales", "Q1", "Feb"),
("Sales", "Q2", "Mar")
])
vehicles = ['car', 'bike']
values = ['A', 'B', 'C']
index = pd.MultiIndex.from_product([vehicles, values], names=['Vehicle', 'Type'])
df = pd.DataFrame(np.random.randn(6, 3), index=index, columns=columns)
print("Original columns:")
print(df.columns)
# Drop level 1 (middle level)
df.columns = df.columns.droplevel(1)
print("\nAfter dropping level 1:")
print(df.columns)
print("\nDataFrame:")
print(df)
Original columns:
MultiIndex([('Sales', 'Q1', 'Jan'),
('Sales', 'Q1', 'Feb'),
('Sales', 'Q2', 'Mar')],
)
After dropping level 1:
MultiIndex([('Sales', 'Jan'),
('Sales', 'Feb'),
('Sales', 'Mar')],
)
DataFrame:
Sales
Jan Feb Mar
Vehicle Type
car A 0.52 -1.86 0.28
B -0.45 1.23 -0.67
C 1.45 -0.32 0.89
bike A -0.78 0.56 1.34
B 0.23 -1.45 0.67
C -0.89 0.78 -0.23
Conclusion
Use DataFrame.columns.droplevel(level_index) to remove specific levels from multi-level column indexes. This simplifies DataFrame structure while preserving data and remaining hierarchy levels.
