kaggle

DataFrame型で値を指定しているのに代入できないときの対処法

データフレームで場所を指定しているのに反映されない!?なぜ!!??

pandasの深い深い闇にはまり2時間以上溶かしたので、共有をします。

やりたいこと

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コース を二ヶ月間...

COMMENT

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です