Why do we need to redefine pandas DataFrame after changing columns?
Each class defines what changes can be done in-place and which can't, creating instead a new object.  The reasons are varied and can't be reduced to a few simple rules.
The underlying data structure of a list is designed for growth and shrinkage.  Even so some changes are cheaper than others.  append and pop at the end requires fewer changes of the data than addition or removal of items at the beginning or middle.  Even so, actions like blist = alist[1:] produce a new list.
tuple is a variation on list that is immutable, and is widely used in the base Python for function arguments and packing/unpacking results.
A numpy array has a fixed size. Like lists, individual values can be changed in-place, but growth requires making a new array (except for a limited use of resize).  numpy also has a view mechanism that makes a new array, but which shares underlying data.  This can be efficient, but has pitfalls for the unwary.
pandas is built on numpy, with indices and values stored in arrays.  As other answers show it often has a in-place option, but I suspect that doesn't actually reduce the work or run time.  We'd have to know a lot more about the change(s) and dataframe structure.
Ultimately we, SO posters, can't answer "why" questions authoritatively.  We can only give opinions based on knowledge and experience.  Most of us are not developers, and certainly not original developers.
I just wondered why Pandas DataFrame class functions do not change their instance.
For example, if I use pd.DataFrame.rename(), dropn(), I need to update the instance by redefining it. However, if its class is list, you can delete an element by a pop() method without redefining it. The function changes its intrinsic instance.
Is there a reason why pandas or numpy use this kind of style?
Can you explain why this kind of styling is better or its advantages?