pythonで.copy()をしたりしなかったり




前提を話しておきますと、当方python勉強中みたいな感じです。超初歩的な話でした。

2つ似たようなプログラムがあって、挙動で最終的にMECEになるようになってるはずなのに、書き方が地味に違うのでなんでだろう、と思って調査。

プログラム1
df = root_df.loc[~(root_df.status.isin([1,2]))]

プログラム2
df = root_df.loc[(root_df.status.isin([1,2]))].copy()

こんな感じになっていて、statusが1、2の時、それ以外とMECEにしたいのはわかるんですが、片方にはcopy()がついてる。なんでついてるんだろう、と思ったんですが、

そもそもプログラム1の場合はroot_dfの絞り込みフィルタを着けた名前を用意しただけで、変更するとroot_dfの実体も変更しちゃう。
プログラム2に関してはコピーして別のdfとして立ち上げてるので、df変更してもroot_dfの実体は触らない、ということでした。

後続の挙動によってどっちがいいか変わりますけど、データを片方修正して、更にroot_dfはそれはそれで使いたい、みたいな場合はcopyしましょう。