The index attribute of a Pandas Series provides access to the labels associated with each element in the Series. These labels serve as identifiers that let you look up, align, and organize data efficiently. Understanding how to read, set, and modify the index is fundamental to working effectively with Pandas.
This guide explains the index attribute with practical examples covering common use cases.
What Is the Series Index?
A Pandas Series is a one-dimensional labeled array. Every element has two components: a value and a corresponding index label. By default, the index is a sequence of integers starting at 0, but it can be set to any hashable values - strings, dates, or even tuples.
import pandas as pd
s1 = pd.Series([10, 20, 30])
print("Default index:")
print(s1)
s2 = pd.Series([10, 20, 30], index=['a', 'b', 'c'])
print("\nCustom index:")
print(s2)Output:
Default index:
0 10
1 20
2 30
dtype: int64
Custom index:
a 10
b 20
c 30
dtype: int64The index makes it possible to access elements by label (e.g., s2['b'] returns 20) rather than relying solely on positional indexing.
Syntax
Series.index
Series.index = new_index| Property | Details |
|---|---|
| Access | Returns an Index object containing all labels |
| Assignment | Accepts any array-like of the same length as the Series |
| Supports | Unique labels, duplicate labels, strings, integers, dates, and more |
Accessing the Index
Use the .index attribute to retrieve the current index labels:
import pandas as pd
data = pd.Series([100, 200, 300, 400], index=['Q1', 'Q2', 'Q3', 'Q4'])
print("Index labels:", data.index)
print("Index type: ", type(data.index))
print("Index dtype: ", data.index.dtype)Output:
Index labels: Index(['Q1', 'Q2', 'Q3', 'Q4'], dtype='object')
Index type: <class 'pandas.core.indexes.base.Index'>
Index dtype: objectYou can also convert the index to a standard Python list:
import pandas as pd
data = pd.Series([100, 200, 300, 400], index=['Q1', 'Q2', 'Q3', 'Q4'])
print("As list:", data.index.tolist())Output:
As list: ['Q1', 'Q2', 'Q3', 'Q4']Modifying the Index
You can replace the entire index by assigning a new array-like of the same length:
import pandas as pd
data = pd.Series([10, 20, 30, 40], index=['a', 'b', 'c', 'd'])
print("Before:")
print(data)
data.index = ['w', 'x', 'y', 'z']
print("\nAfter:")
print(data)Output:
Before:
a 10
b 20
c 30
d 40
dtype: int64
After:
w 10
x 20
y 30
z 40
dtype: int64The values remain unchanged - only the labels are updated.
Common Mistake: Mismatched Index Length
Assigning an index with a different length than the Series raises a ValueError:
import pandas as pd
data = pd.Series([10, 20, 30])
try:
data.index = ['a', 'b', 'c', 'd']
except ValueError as e:
print(f"ValueError: {e}")Output:
ValueError: Length mismatch: Expected axis has 3 elements, new values have 4 elementsThe correct approach
Ensure the new index has exactly the same number of elements:
import pandas as pd
data = pd.Series([10, 20, 30])
data.index = ['a', 'b', 'c']
print(data)Output:
a 10
b 20
c 30
dtype: int64Using Duplicate Index Labels
Unlike Python dictionaries, Pandas allows duplicate labels in the index. This can be useful when multiple elements belong to the same category:
import pandas as pd
cities = pd.Series(['New York', 'Chicago', 'Toronto', 'Lisbon'])
cities.index = ['Americas', 'Americas', 'Americas', 'Europe']
print(cities)Output:
Americas New York
Americas Chicago
Americas Toronto
Europe Lisbon
dtype: objectAccessing a duplicate label returns all matching elements as a Series:
import pandas as pd
cities = pd.Series(['New York', 'Chicago', 'Toronto', 'Lisbon'])
cities.index = ['Americas', 'Americas', 'Americas', 'Europe']
print(cities['Americas'])Output:
Americas New York
Americas Chicago
Americas Toronto
dtype: objectResetting the Index to Default
To restore the default integer index (0, 1, 2, ...), use the reset_index() method:
import pandas as pd
data = pd.Series(
['1/1/2024', '2/1/2024', '3/1/2024', '4/1/2024'],
index=['Day 1', 'Day 2', 'Day 3', 'Day 4']
)
print("Before reset:")
print(data)
data = data.reset_index(drop=True)
print("\nAfter reset:")
print(data)Output:
Before reset:
Day 1 1/1/2024
Day 2 2/1/2024
Day 3 3/1/2024
Day 4 4/1/2024
dtype: object
After reset:
0 1/1/2024
1 2/1/2024
2 3/1/2024
3 4/1/2024
dtype: object| Parameter | Effect |
|---|---|
drop=True |
Discards the old index entirely |
drop=False (default) |
Moves the old index into a column (returns a DataFrame) |
inplace=True |
Modifies the Series in place instead of returning a new one |
Using the Index for Data Access
The index enables label-based access through loc[] and bracket notation:
import pandas as pd
temperatures = pd.Series(
[72, 68, 75, 80, 77],
index=['Mon', 'Tue', 'Wed', 'Thu', 'Fri']
)
print("Wednesday temp:", temperatures['Wed'])
print("Mon to Wed:")
print(temperatures.loc['Mon':'Wed'])Output:
Wednesday temp: 75
Mon to Wed:
Mon 72
Tue 68
Wed 75
dtype: int64Checking Index Properties
The index object has several useful properties and methods:
import pandas as pd
data = pd.Series([10, 20, 30, 20], index=['a', 'b', 'c', 'd'])
print("Is unique: ", data.index.is_unique)
print("Has duplicates:", data.index.has_duplicates)
print("Size: ", data.index.size)
print("Name: ", data.index.name)
data.index.name = 'label'
print("\nWith named index:")
print(data)Output:
Is unique: True
Has duplicates: False
Size: 4
Name: None
With named index:
label
a 10
b 20
c 30
d 20
dtype: int64Quick Reference
| Operation | Syntax | Returns |
|---|---|---|
| Get index labels | series.index |
Index object |
| Set new labels | series.index = [...] |
None (modifies in place) |
| Reset to default | series.reset_index(drop=True) |
Series with integer index |
| Check uniqueness | series.index.is_unique |
True or False |
| Get index size | series.index.size |
Integer |
| Convert to list | series.index.tolist() |
Python list |
| Name the index | series.index.name = 'label' |
None (modifies in place) |
The index attribute is central to how Pandas organizes, aligns, and retrieves data. Whether you are setting custom labels for readability, using dates as an index for time-series analysis, or resetting to defaults after sorting, understanding the index gives you precise control over your data structure.