機械学習で、データの前処理が終わったあとに、仮説を持ちながら、
データと戯れる?弄る?フェーズがあると思うのですが、
そのときにpandasを如何に自由自在に操れるかというのが、
大切になってくると思っています。
私自身、少しだけプログラミングの経験や、データベースの知識がある中で、
pandasのDataFrameの [] ←これややこしすぎ!!
特に、条件で絞り込むのがつらいなと。
train[train["company_id"] == 1088]["meter_reading"]
この時点でややこしいけど、これがtrain_weather_dfだったら、もうまじで破滅する
train_weather_df[train_weather_df[“company_id”]==1088][“meter_readings”]
さらに、条件が二つになると、より恐ろしいことが起こります・・・
なので、少し複雑なことをやるには、
.query()を使うのが良いと思う。
train.query(qry)["meter_reading"]
ただ絞り込んだあと、分析用に「これをグループ1」としようみたいなことってあると思うのですが、
queryメソッドで取ってきたときに直接代入はできないのが注意。
×××× train.query(qry )["group"] = 1
はできない!!
そのときの少し回りくどいやり方だけど、多分以下が良いと思います。
qry = 'company_id == 1088 & meter_reading > 20000'
target_idx = train.query(qry).index
train["group"].loc(target_idx) = 1
可読性もそこまで悪くないし、何より、
train.loc(target_idx)
これで、うまく絞れてるかを確認できるのが良いと思います。
ただ、queryの中に入れられる文字には制限があるそうで、、
そのあたりはいつか困ることになるかもしれない。
ちなみに、このサイトのqueryの例は参考になります。
https://ohke.hateblo.jp/entry/2019/01/12/230000
(engine = pythonとかね)
※追記
queryの中で変数を使いたいというケースがあると思うんですが、
@を頭につけると、変数として認識してくれます!!
これめちゃくちゃ重要。
tmp_q = "name_ns == @t_name & year == @t_year "
参考にした記事
https://qiita.com/kurumen-b/items/45b60299f0893a537f2a
https://qiita.com/mwmsnn/items/6a464865759231aa888d
さらに追記
最近のpandasだと、列絞ってから、ilocみたいな書き方が推奨されないようで、
余計にこの記法が重要になりそうです。
行番号、列番号、行ラベル、カラム名あたりを行ったり来たりしたくなったら、以下を参照
https://note.nkmk.me/python-pandas-get-loc-row-column-num/