Have you tried to insert a column and been told the name is taken?
sales.insert(0, 'region', [1, 2, 3])
ValueError: cannot insert region, already exists
insert places a column at a position, and unlike plain assignment it refuses to overwrite. That is deliberate: assignment replacing a column silently is convenient, and doing the same while also moving it would be a good way to lose data without noticing.
If replacing is what you want, assign instead — sales['region'] = ... — and use insert only when the position matters.
reset_index is where most people meet it
The version that arrives without any insert in sight comes from reset_index:
by_region = sales.groupby('region').sum()
by_region.reset_index()
If the frame already has a column called region, moving the index of the same name back into the columns would create two, so Pandas stops. It is insert underneath, which is why the message mentions a method you did not call.
Three ways out, depending on what you meant:
by_region.reset_index(drop=True) # throw the index away
by_region.reset_index(names='region_key') # rename it on the way in
by_region.rename_axis(None).reset_index() # clear the index name first
drop=True is right when the index is a row number you do not need. names= is right when the index holds something real and the collision is just a naming clash.
When a duplicate is genuinely wanted
Rarely, but it happens — a frame destined for a format that expects a repeated column. insert will do it if you insist:
sales.insert(0, 'region', [1, 2, 3], allow_duplicates=True)
I would think twice. Two columns with one name make every later selection ambiguous: df['region'] returns a data frame rather than a Series, and code that expects a Series starts failing in places far from here.
The mistakes I see most often
Re-running a cell. The first run inserted the column, the second meets it already there. In a notebook this is the single most common cause, and it is not really an error in the code.
Confusing the index name with a column name. df.index.name and df.columns are separate namespaces until reset_index merges them.
Reaching for drop=True by reflex. It is the quickest way to silence the message and it discards the index. If the index held your grouping keys, that is the data.
Practice
See reset_index in Pandas for moving an index into the columns, and insert in Pandas for placing a column at a position.