Pandasを使っていて、つまずいた点をメモします。
その点とは、インデックス参照でデータフレームの値を変更するときは、真偽値の条件を後にする!という点です。
わかるまで地味に時間がかかりました..
概要
データフレームの値を更新するときインデックス参照が使えます。
その際、2つの条件で更新対象の要素を指定したいケースがよくあります。
例えば、次のケースです。
- この列の値を更新する
- この列がこの値より大きい要素を更新する
このとき、次のように書きますよね。
df["この列"][df["この列"] > この値] = 書き換える値 # OK (書き変わる)
ですが、書き方によってはうまく動かず、値が書き変わらないです。
例えば、次のように逆に書くと値が書き変わりません。
df[df["この列"] > この値]["この列"] = 書き換える値 # NG (何も起こらない)
この2つの違いは何でしょうか?
それは2つある条件(インデックス参照)のうち、真偽値の配列(df["この列"] > この値
)を後に書くか前に書くかという点です。
結論からすると、次のように真偽値の配列を後にします。
- 真偽値の配列を後に書くと動く(値が書き変わる)
- 真偽値の配列を前に書くと動かない(値が書き変わらない)
ちなみに、値の書き換えは上述のように動きが異なりますが、単に選択するだけであれば同じ動きになります。
具体例
文章だけだとわかりずらいので、コードを載せます。
補足
なんでこんな動きになるのかは、理解できていません。(ちょっと悔しい...)
なお、GitHub (Gist)のソース貼り付けについては、次の記事にお世話になりました。
GoogleColaboratoryで書いたipynbをGistに公開する - 深層学習とその他
まとめ
ということで、インデックス参照でデータフレームの値を変更するときは、真偽値の条件を後にする!というポイントを覚えておこうと思います!
なお、Pandasを含め、Pythonには様々なコツが必要なシーンが多々あります。
Python、Pandas、データ分析、に関するコツなどを次の記事にまとめてありますので、是非読んでみてください!
intellista.hatenablog.com