Best practice for cleaning Pandas dataframe columns
This is not too bad. It's a good thing you use keyword arguments for the replace method
I always try to keep my original data in its original state, and continue with the cleaned dataframe.
fluent style
This lends itself very well to a kind of fluent style as in this example. I use it too, and use a lot of df.assign, df.pipe, df.query...
In this example I would do something like
df_cleaned = df.assign(
    col2=(
        df[&quot;col2&quot;]
        .str.lower()
        .str.strip()
        .replace(to_replace=&quot;[^a-zA-Z ]&quot;, value=&quot;&quot;, regex=True)
    )
)

So definately no inplace replacements