4
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

pandasでデータいじりのベストプラクティス

Last updated at Posted at 2019-11-04

機械学習で、データの前処理が終わったあとに、仮説を持ちながら、
データと戯れる?弄る?フェーズがあると思うのですが、
そのときに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/

4
5
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?