Skip to content

Python Pandas: How to Start DataFrame Index at 1 (Instead of 0)

Learn how to change a Pandas DataFrame index from 0-based to 1-based using methods like df.index += 1, range(), np.arange(), or pd.RangeIndex() for data alignment, display, or analysis needs.

By default, when you create a Pandas DataFrame without specifying an index, or when you reset an existing index, Pandas assigns a zero-based integer RangeIndex (0, 1, 2, ...). However, for various reasons, such as display preferences, matching external data sources, or specific analytical requirements, you might need your DataFrame's index to start at 1 instead of 0.

This guide demonstrates several common methods to set or change a Pandas DataFrame's index to start from 1.

Understanding Default DataFrame Index (Starts at 0)

When a DataFrame is created, if no explicit index is provided, Pandas automatically creates a default RangeIndex. This index starts at 0 and increments by 1 for each row, up to n-1 where n is the number of rows.

import pandas as pd
import numpy as np # For some examples

data = {
    'Product': ['Laptop', 'Mouse', 'Keyboard', 'Monitor'],
    'Price': [1200, 25, 75, 300],
    'Stock': [10, 150, 75, 20]
}
df_original = pd.DataFrame(data)

print("Original DataFrame with default index (starts at 0):")
print(df_original)
print("Original index object:")
print(df_original.index)

Output:

Original DataFrame with default index (starts at 0):
    Product  Price  Stock
0    Laptop   1200     10
1     Mouse     25    150
2  Keyboard     75     75
3   Monitor    300     20
Original index object:
RangeIndex(start=0, stop=4, step=1)

Method 1: Modifying an Existing Index (df.index += 1)

If your DataFrame already exists and has a default integer-based RangeIndex (or any numeric index where addition makes sense), you can directly modify the df.index attribute.

import pandas as pd

df = pd.DataFrame({
    'Product': ['Laptop', 'Mouse', 'Keyboard', 'Monitor'],
    'Price': [1200, 25, 75, 300],
    'Stock': [10, 150, 75, 20]
})

print("DataFrame before index modification:")
print(df)
print(f"Index before: {df.index}")

df.index += 1

print("DataFrame after df.index += 1:")
print(df)
print(f"Index after: {df.index}")

Output:

DataFrame before index modification:
    Product  Price  Stock
0    Laptop   1200     10
1     Mouse     25    150
2  Keyboard     75     75
3   Monitor    300     20
Index before: RangeIndex(start=0, stop=4, step=1)
DataFrame after df.index += 1:
    Product  Price  Stock
1    Laptop   1200     10
2     Mouse     25    150
3  Keyboard     75     75
4   Monitor    300     20
Index after: RangeIndex(start=1, stop=5, step=1)

Method 2: Assigning a New Index using range()

You can create a new sequence of numbers starting from 1 using Python's built-in range() function and assign it to df.index.

import pandas as pd

df = pd.DataFrame({
    'Product': ['Laptop', 'Mouse', 'Keyboard', 'Monitor'],
    'Price': [1200, 25, 75, 300],
    'Stock': [10, 150, 75, 20]
})


num_rows = len(df) # Or df.shape[0]
new_index_range = range(1, num_rows + 1)
print(list(new_index_range))

df.index = new_index_range

print("DataFrame with index set using range(1, len(df) + 1):")
print(df)
print(f"Index object type: {type(df.index)}") # Often still a RangeIndex or Int64Index

Output:

[1, 2, 3, 4]
DataFrame with index set using range(1, len(df) + 1):
    Product  Price  Stock
1    Laptop   1200     10
2     Mouse     25    150
3  Keyboard     75     75
4   Monitor    300     20
Index object type: <class 'pandas.core.indexes.range.RangeIndex'>

Method 3: Assigning a New Index using numpy.arange()

Similar to range(), NumPy's arange() can create an array of numbers to be used as the index.

import pandas as pd
import numpy as np # Ensure NumPy is imported

df = pd.DataFrame({
    'Product': ['Laptop', 'Mouse', 'Keyboard', 'Monitor'],
    'Price': [1200, 25, 75, 300],
    'Stock': [10, 150, 75, 20]
})


num_rows = len(df)
new_index_np = np.arange(1, num_rows + 1)

df.index = new_index_np

print("DataFrame with index set using np.arange(1, len(df) + 1):")
print(df)

Output:

DataFrame with index set using np.arange(1, len(df) + 1):
    Product  Price  Stock
1    Laptop   1200     10
2     Mouse     25    150
3  Keyboard     75     75
4   Monitor    300     20

Method 4: Setting Index During DataFrame Creation using pd.RangeIndex()

You can specify a 1-based index directly when creating the DataFrame using pd.RangeIndex.

import pandas as pd

data = {
    'Product': ['Laptop', 'Mouse', 'Keyboard', 'Monitor'],
    'Price': [1200, 25, 75, 300],
    'Stock': [10, 150, 75, 20]
}

num_rows = len(data['Product'])

df_with_1_based_index = pd.DataFrame(
    data,
    index=pd.RangeIndex(start=1, stop=num_rows + 1, name='MyCustomIndexName') # 'name' is optional
)

print("DataFrame created with 1-based RangeIndex:")
print(df_with_1_based_index)
print()
print(f"Index object: {df_with_1_based_index.index}")

Output:

DataFrame created with 1-based RangeIndex:
                    Product  Price  Stock
MyCustomIndexName                        
1                    Laptop   1200     10
2                     Mouse     25    150
3                  Keyboard     75     75
4                   Monitor    300     20

Index object: RangeIndex(start=1, stop=5, step=1, name='MyCustomIndexName')
  • pd.RangeIndex(start, stop, step, name): Creates a specialized index object for ranges.
  • start=1: Sets the starting value of the index.
  • stop=num_rows + 1: The stopping point (exclusive).
  • name='...': Optionally assigns a name to the index.

Choosing the Right Method

  • For existing DataFrames with a 0-based RangeIndex: df.index += 1 (Method 1) is the most concise and direct way to shift it to be 1-based.
  • For existing DataFrames (general): Assigning df.index = range(1, len(df) + 1) (Method 2) or df.index = np.arange(1, len(df) + 1) (Method 3) are clear and effective for replacing the entire index with a 1-based sequence.
  • When creating a new DataFrame: Using index=pd.RangeIndex(start=1, stop=len_data + 1) (Method 4) allows you to set the 1-based index from the outset.

All these methods achieve the goal of having a DataFrame index that starts at 1. The best choice often depends on whether you're modifying an existing DataFrame or creating a new one, and your preference for conciseness.

Conclusion

While Pandas DataFrames default to a 0-based index, you can easily change this to a 1-based index (or any other starting integer) if your application requires it.

  • Directly modify an existing numeric index using df.index += 1.
  • Assign a new index created with range(1, len(df) + 1) or np.arange(1, len(df) + 1).
  • Specify pd.RangeIndex(start=1, ...) during DataFrame creation.

These methods provide flexible control over your DataFrame's row labeling, allowing you to adapt it to various data presentation and analysis needs.

Navigation