データフレームで場所を指定しているのに反映されない!?なぜ!!??
pandasの深い深い闇にはまり2時間以上溶かしたので、共有をします。
Contents
やりたいこと
DataFrame型をの変数に、indexとcolumnsを指定して、それと同じshapeのnumpy配列を代入する。
沼にはまるパターン
# きれいにデータフレーム型を表示させるための呪文
# pyファイルに変換をしても怒られないのでオススメです。
from IPython.core.interactiveshell import InteractiveShell
InteractiveShell.ast_node_interactivity = "all"
a = np.array([[1,2,3],[2,3,4],[3,4,5],[1,2,3]])
b = np.array([5,5,5,5])
df = pd.DataFrame(a)
df
idx = [False, True, False, True ]
cols = [1,2]
df[idx][cols]
df[idx][cols] = [100,100]
df



df[idx][cols]の部分で、参照したい部分は確かに参照できていることが分かります。
なのに、なんといいうことでしょう!
代入したはずの[100, 100]が反映されていないではないですか!!
そうです。これが今回お伝えしたかった沼です。
df[idx][cols]という記法では参照しかされないらしいです。
おぞましすぎます。
代入されないくせに、何もエラーを吐かないのです。
悪魔です。
では、どうしたらきちんと代入をしてくれるのか??
きちんと代入できるパターン
from IPython.core.interactiveshell import InteractiveShell
InteractiveShell.ast_node_interactivity = "all"
a = np.array([[1,2,3],[2,3,4],[3,4,5],[1,2,3]])
b = np.array([5,5,5,5])
df = pd.DataFrame(a)
df
idx = [False, True, False, True ]
cols = [1,2]
df.loc[idx,cols]
# ココをlocに変更!
df.loc[idx,cols] = [100,100]
df



正しく代入されていることがわかります。
データフレーム型の変数を変えるにはlocで指定しないといけないらしいです。
知らなかった…
他にも, iloc, at ,も変数を変えることができるそうです。
まとめ
沼にはまったおかげで一生忘れない知見になったと思います。
ちょっとずつ細かい仕様も覚えていきながらハッピーpandasライフを送りたいです。
スポンサーリンク
タイピングもままならない完全にプログラミング初心者から
アホいぶきんぐ
プログラミングってどこの国の言語なの~?
たった二ヶ月で
いぶきんぐ
え!?人工知能めっちゃ簡単にできるじゃん!
応用も簡単にできる…!!
という状態になるまで、一気に成長させてくれたオススメのプログラミングスクールをご紹介します!



テックアカデミーのPython+AIコースを受講した僕が本音のレビュー・割引あり! というプログラミング完全初心者だった僕が
Tech Academy(テックアカデミー)のPython×AIコース を二ヶ月間...