Main Ecosystems
HomePython CorePandas ReferenceNumPy ScientificFastAPI & PydanticDjango Enterprise
More Ecosystems
Environment & SetupRequests & HTTPAsyncIO ConcurrencyObject-Oriented OOPPyTorch Deep LearningScikit-Learn MLFlask FrameworkWeb ScrapingDatabase & ORMDevOps & Docker

ValueError: cannot reindex on an axis with duplicate labels in Pandas

Verified FixPython 3.10+Pandas 2.0+Silo: pandas

Quick Fix / Solution Rapide

This error occurs when attempting to reindex a DataFrame or Series that contains duplicate index labels. Deduplicate the index with ~df.index.duplicated() or reset_index().

Root Cause Analysis

This error occurs when Python tries to reindex, align, or merge a pandas DataFrame or Series, but one of the indexing axes contains duplicate labels, preventing an unambiguous one-to-one index mapping.

Cause 1: Reindexing on an Index with Duplicate Labels

Calling .reindex() requires every label in the target index to map unambiguously to a single position in the original series. When duplicate index labels exist (e.g. index=['a', 'a', 'b']), pandas raises ValueError: cannot reindex on an axis with duplicate labels.

Cause 2: Concatenation with Overlapping Indices

Stacking multiple DataFrames with pd.concat([df1, df2]) without setting ignore_index=True creates duplicate row labels that cause downstream alignment failures.

Cause 3: GroupBy or Merge Operations Retaining Non-Unique Keys

Transforming data or setting non-unique columns as the DataFrame index introduces duplicate index values.

Reproduction Code (MCVE)

Example: Bug Reproduction
import pandas as pd

s = pd.Series([10, 20, 30], index=['a', 'a', 'b'])
# Reindexing with duplicate index labels raises ValueError
s.reindex(['a', 'b', 'c'])

Solution 1: Deduplicate Index Labels with ~index.duplicated()

Filter out duplicate index entries prior to reindexing, keeping either the first or last occurrence of each label.

Example: Recommended Solution
import pandas as pd

s = pd.Series([10, 20, 30], index=['a', 'a', 'b'])
# Keep first occurrence of each duplicate index label
s_clean = s[~s.index.duplicated(keep='first')]
result = s_clean.reindex(['a', 'b', 'c'])
print(result)

Solution 2: Reset the Index to Default Monotonic Integers

Promote duplicate index values into a regular DataFrame column using .reset_index() to restore unique integer indexing.

Example: Alternative Solution
import pandas as pd

s = pd.Series([10, 20, 30], index=['a', 'a', 'b'])
df_reset = s.reset_index()
df_reset.columns = ['key', 'value']
print(df_reset)

Common Mistakes & Edge Cases

1. .loc[] Behavior on Duplicate Indices

When an index is unique, s.loc['a'] returns a scalar. When the index contains duplicate 'a' labels, s.loc['a'] returns a Series. This polymorphic return type can introduce silent bugs in downstream calculations.

2. Contrasting ValueError vs KeyError

  • ValueError: Raised when reindexing on an axis with duplicate labels.
  • KeyError: Raised when looking up a single missing label with .loc['missing'].

3. Verifying Index Uniqueness

Use df.index.is_unique as a pipeline validation check before calling reindex or merge operations.