Home » How to solve SettingWithCopyWarning when using the ‘inplace’ parameter in pandas

How to solve SettingWithCopyWarning when using the ‘inplace’ parameter in pandas

  • by
  • 2 min read

The SettingWithCopyWarning message is a confusing warning to many who are new to Pandas. If you’ve ever taken a computer science course, you might be aware of passing/copying by value or by reference. Well, it very much applies to pandas DataFrames too. Let’s go.

Basically, when you are slicing a DataFrame, Pandas isn’t always very clear whether you are making a copy or a view. A copy is truly a new object, while a view is only a subset that refers to the initial object. When you apply changes to an object that might be a view, and not a DataFrame, you’ll run into the following error.

SettingWithCopyWarning:
A value is trying to be set on a copy of a slice from a DataFrame.

If this message occurs when you’re using the inplace parameter, you’re likely applying a transformation on a subset of another DataFrame. I created an apple-themed example below (the fruit, not the tech giant).

apples = pd.DataFrame({
  'type': ['jonagold', 'golden', 'granny smith'], 
  'weight': [100, 120, 110]
})

apples2 = apples[apples['weight'] >= 110]

apples2['type'].replace({'golden': 'cox'}, inplace=True)

When you use the inplace parameter in the replace method, you are applying the changes to apples2, which is a view of apples.

But… everything works as expected. We changed apples2 as we wanted, and apples is untouched. Then why is Python showing the error? Because we are modifying a view, Python can’t know if it is our intention to edit the initial DataFrame apples, or the view apples2.

You can check if a DataFrame is a copy or a view as follows:

apples2._is_view

To avoid the error, it is good practice to copy() a DataFrame when slicing/subsetting it. I modified the initial example:

apples = pd.DataFrame({
  'type': ['jonagold', 'golden', 'granny smith'], 
  'weight': [100, 120, 110]
})

apples2 = apples[apples['weight'] >= 110].copy()
apples2['type'].replace({'golden': 'cox'}, inplace=True)

Great success!

Say thanks, ask questions or give feedback

Technologies get updated, syntax changes and honestly… I make mistakes too. If something is incorrect, incomplete or doesn’t work, let me know in the comments below and help thousands of visitors.

Leave a Reply

Your email address will not be published. Required fields are marked *