# Add a Row of Zeros to a Pandas DataFrame

In this tutorial, you’ll learn how to add a row of zeros to a Pandas DataFrame.

In any real-world data analysis or data science task, you often need to add new rows to an existing DataFrame.

This could be to perform calculations, to benchmark data, or simply to prepare your DataFrame for further transformations.

Adding a row of zeros serves as a useful starting point for many of these tasks.

## Using loc Property

The loc[] property allows us to insert this row at the end of the DataFrame.

Let’s assume you’re working with data that looks like this:

import pandas as pd
df = pd.DataFrame({
'customer_id': ['001', '002', '003'],
'monthly_charges': [45.0, 55.0, 65.0],
'tenure': [12, 24, 36]
})
print(df)

Output:

customer_id  monthly_charges  tenure
0         001             45.0      12
1         002             55.0      24
2         003             65.0      36

To add a row of zeros, you can use the following code:

df.loc[len(df)] = [0, 0.0, 0]
print(df)

Output:

customer_id  monthly_charges  tenure
0         001             45.0      12
1         002             55.0      24
2         003             65.0      36
3           0              0.0       0

## Adding a Row of Zeros at a Specific Position

Sometimes, you need to insert a row of zeros at a specific position—be it at the top or in the middle.

Let’s explore each of these scenarios using our ongoing telecom data example.

### Inserting a Row at the Top

If you want to insert a row at the top of your DataFrame, you can achieve this by resetting the index. Here’s how:

df = pd.DataFrame({
'customer_id': ['001', '002', '003'],
'monthly_charges': [45.0, 55.0, 65.0],
'tenure': [12, 24, 36]
})

# Create a row of zeros
new_row = pd.DataFrame({'customer_id': [0], 'monthly_charges': [0.0], 'tenure': [0]})

# Insert the row at the top
df = pd.concat([new_row, df]).reset_index(drop=True)
print(df)

Output:

customer_id  monthly_charges  tenure
0           0              0.0       0
1         001             45.0      12
2         002             55.0      24
3         003             65.0      36

By using pd.concat along with reset_index(drop=True), you insert the row at the top, and the index is also reset to maintain continuity.

### Inserting a Row in the Middle

To insert a row in the middle, you can use the iloc property to split the DataFrame and then concatenate it back.

# Split DataFrame into two parts
df1 = df.iloc[:2]
df2 = df.iloc[2:]

# Insert the row of zeros in between
df = pd.concat([df1, new_row, df2]).reset_index(drop=True)
print(df)

Output:

customer_id  monthly_charges  tenure
0           0              0.0       0
1         001             45.0      12
2           0              0.0       0
3         002             55.0      24
4         003             65.0      36

We split the DataFrame into two parts—df1 and df2—and then inserted the new row between them. Again, we used reset_index(drop=True) to adjust the index.

## Adding Zeros in Numeric Columns Only

You might want to maintain the string or object data type in certain columns while initializing numeric columns with zeros.

Let’s say your DataFrame looks like this:

df = pd.DataFrame({
'customer_id': ['001', '002', '003'],
'monthly_charges': [45.0, 55.0, 65.0],
'tenure': [12, 24, 36]
})
print(df)

Output:

customer_id  monthly_charges  tenure
0         001             45.0      12
1         002             55.0      24
2         003             65.0      36

You can selectively add zeros to numeric columns as follows:

# Create a new row with zeros in numeric columns and None in non-numeric columns
new_row = pd.Series({col: 0 if df[col].dtype == 'float64' or df[col].dtype == 'int64' else 'None' for col in df.columns})

# Append the new row to the DataFrame
df.loc[len(df)] = new_row
print(df)

Output:

customer_id  monthly_charges  tenure
0         001             45.0    12.0
1         002             55.0    24.0
2         003             65.0    36.0
3        None              0.0     0.0

The dtype property helps identify the data type of each column, allowing us to add zeros only to numeric ones.

## Using DataFrame.apply for Conditional Zeros

There might be cases where you’d like to insert rows of zeros based on certain conditions.

For example, if the monthly_charges of existing customers are below a certain threshold, you might want to add a row of zeros to highlight this condition.

The DataFrame.apply method allows you to apply a function across the DataFrame to meet specific conditions.

Let’s proceed with our DataFrame to illustrate this:

df = pd.DataFrame({
'customer_id': ['001', '002', '003'],
'monthly_charges': [25.0, 55.0, 65.0],
'tenure': [12, 24, 36]
})
print(df)

Output:

customer_id  monthly_charges  tenure
0         001             25.0      12
1         002             55.0      24
2         003             65.0      36

Now let’s say you want to add a row of zeros if any customer has monthly_charges below 30. Here’s how you can do it:

# Function to check if a row of zeros should be added
return row['monthly_charges'] < 30
if result.any():
new_row = {'customer_id': '', 'monthly_charges': 0.0, 'tenure': 0}
indexes = df.index
df.loc[len(indexes)] = new_row
print(df)

Output:

customer_id  monthly_charges  tenure
0         001             25.0      12
1         002             55.0      24
2         003             65.0      36
3                          0.0       0

In this example, the function should_add_row checks if the monthly_charges of any row are below 30.

We then apply this function to the DataFrame using DataFrame.apply, and it returns a boolean Series (result).

If any of the values in the Series are True, a row of zeros gets added to the DataFrame.

## Adding Rows of Zeros in DataFrames with Multi-Indices

Let’s create a sample DataFrame with multi-indices consisting of the region and customer_id:

arrays = [['North', 'North', 'South'], ['001', '002', '003']]
index = pd.MultiIndex.from_arrays(arrays, names=('region', 'customer_id'))
df = pd.DataFrame({
'monthly_charges': [45.0, 55.0, 65.0],
'tenure': [12, 24, 36]
}, index=index)
print(df)

Output:

monthly_charges  tenure
region customer_id
North  001                     45.0      12
002                     55.0      24
South  003                     65.0      36

Here’s how to add a row of zeros while maintaining the multi-index structure:

new_row = pd.DataFrame({
'monthly_charges': [0.0],
'tenure': [0]
}, index=pd.MultiIndex.from_arrays([['North'], ['004']], names=('region', 'customer_id')))

# Append the new row to the DataFrame
df = pd.concat([df, new_row])
print(df)

Output:

monthly_charges  tenure
region customer_id
North  001                     45.0      12
002                     55.0      24
South  003                     65.0      36
North  004                      0.0       0

In this example, the new_row DataFrame is created with the same multi-index structure as the original DataFrame (df).