intellista

engineer's notes about application development, data analysis, and so on

Pandasのデータフレームの値を2つのインデックス参照で変更するときは、真偽値の条件を後にする!


Pandasを使っていて、つまずいた点をメモします。
その点とは、インデックス参照でデータフレームの値を変更するときは、真偽値の条件を後にする!という点です。
わかるまで地味に時間がかかりました..

概要

データフレームの値を更新するときインデックス参照が使えます。
その際、2つの条件で更新対象の要素を指定したいケースがよくあります。
例えば、次のケースです。

  • この列の値を更新する
  • この列がこの値より大きい要素を更新する

このとき、次のように書きますよね。

df["この列"][df["この列"] > この値] = 書き換える値 # OK (書き変わる)

ですが、書き方によってはうまく動かず、値が書き変わらないです。
例えば、次のように逆に書くと値が書き変わりません。

df[df["この列"] > この値]["この列"] = 書き換える値 # NG (何も起こらない)

この2つの違いは何でしょうか?
それは2つある条件(インデックス参照)のうち、真偽値の配列(df["この列"] > この値)を後に書くか前に書くかという点です。
結論からすると、次のように真偽値の配列を後にします。

  • 真偽値の配列を後に書くと動く(値が書き変わる)
  • 真偽値の配列を前に書くと動かない(値が書き変わらない)

ちなみに、値の書き換えは上述のように動きが異なりますが、単に選択するだけであれば同じ動きになります。

具体例

文章だけだとわかりずらいので、コードを載せます。

補足

なんでこんな動きになるのかは、理解できていません。(ちょっと悔しい...)

なお、GitHub (Gist)のソース貼り付けについては、次の記事にお世話になりました。
GoogleColaboratoryで書いたipynbをGistに公開する - 深層学習とその他

まとめ

ということで、インデックス参照でデータフレームの値を変更するときは、真偽値の条件を後にする!というポイントを覚えておこうと思います!

なお、Pandasを含め、Pythonには様々なコツが必要なシーンが多々あります。
Python、Pandas、データ分析、に関するコツなどを次の記事にまとめてありますので、是非読んでみてください!
intellista.hatenablog.com