Python Pandas: How to Start DataFrame Index at 1 (Instead of 0)
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}")
# ✅ Add 1 to the existing index
df.index += 1
# This is shorthand for: 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)
This is a concise way to shift an existing 0-based RangeIndex
to be 1-based. This modifies the DataFrame in place.
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]
# ✅ Create a range starting from 1 up to len(df) + 1 (exclusive end)
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'>
range(start, stop)
:start
is inclusive,stop
is exclusive.len(df)
ordf.shape[0]
gives the number of rows. So,range(1, len(df) + 1)
generates numbers from 1 up tolen(df)
.
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)
# ✅ Create a NumPy array starting from 1
new_index_np = np.arange(1, num_rows + 1)
# print(new_index_np) # Example: [1 2 3 4]
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
np.arange(start, stop)
works similarly to range()
, creating a NumPy array.
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]
}
# Determine the number of rows from your data
# (e.g., length of one of the lists in your data dictionary)
num_rows = len(data['Product'])
# ✅ Create DataFrame with a 1-based RangeIndex
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) ordf.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)
ornp.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.