15日金曜日ははんなりPythonのハンズオンでした。
勉強になることがあったので、メモしておきます。
rangeはクラスです
rangeってよく使います。しかしこれまでなぜか、関数かと思っていました。たまたま、なんでもhelpで調べたらわかるという案件のサンプルが「range」で、masayuki14さんが「へぇrangeってクラスなんや」みたいなことを仰りました。そうなんですよねぇ~と軽く流すと、次にrange関数と書いていました。そこで「rangeはクラス」ってのに、衝撃を受けました。
なんかrangeは関数かと思ってしまいますが、クラスなんですねぇ。あっきーさんと帰るときに話していると、小文字で始まるからですかねぇ見たいな話になりました。helpで引数を見る以外に、知っているつもりでもちゃんと読まないといけないなと痛感しました。
今少し調べると組み込み関数ということで、range関数と公式にも書かれています。
その先のリンク先に行くと、classになっています。
理解のためにはこの辺りを読む必要がありそうな。興味深い。
lambda関数の使用
一時期、中二病のようにlambda関数を使いまくっていた私ですが、今では関数を作りそれを実行する派になっていました。短い処理でも名前を付けて、それの方が分かりやすいのではないかと思っていました。しかし、ハンズオンでお話を聞いていると、関数で書かれているとわざわざ戻って見直さないといけない。しかし、lambda関数を使うとそういう無駄がない。というわけで、簡単な処理はlambdaで書くのがよろしいという感じのものでした。
というわけできょうから再び使い始めました。pandasのデータフレームの処理は、ちょっとしたことが多いので、applyとlambdaを使うのが良いですねぇというのが、今日一日使っての感想でした。というか、こういう用途には積極的に使っていこうと思います。
lambda関数使用例
はい。使用例です。と、その前にapplyを調べておきましょう。
applyは軸に対してfunction、関数を適用するメソッドです。デフォルトではaxis=0に設定されているため、関数は縦に適用されます。axis=1と横に適用すると、データフレームの複数要素を利用した処理ができます。
まずはデータフレームを作成します。
import pandas as pd from datetime import datetime df = pd.DataFrame([[1, 2, 3, 4, 5], [6, 7, 8, 9 , 10],[11, 12, 13, 14, 15]])
次に、第2列を2乗した列を6列目に足す場合、
df[5] = df[2].apply(lambda x: x ** 2)
で、6列目にコラム名5の列が足されます。
最後に複数の列を利用して日付を作ったりする場合は、applyの引数axisに1を渡すと、複数列を使った処理も簡単にできます。
df[6] = df.apply(lambda x: datetime(2019, x[1], x[3]), axis=1)
上のようにコラム名1を月、コラム名3を日にして、日付の列を新たに付け加えるなんてのも簡単です。
こんな感じだと、全然可読性も落ちないし、処理も早いしいうことなしな使い方だなぁと思いました。
終わりに
昔、こういう処理をfor文で回しており「pandas遅いなぁ」と思ったものですが、applyとmapを知ったおかげで「私か知らんかっただけでした。正直すまんかった」と涙したものでした。あと、pandasは結構使い捨てる処理が多いので、こういう感じでlambda関数を使うのは素敵やんと思いました。
あと、Python3.8ハンズオンという名の普通のPythonのハンズオンですが、作ってみると色々気づくことがあって面白かったです。ほかのライブラリなんかに関しても、普段使っているとこれまで知っているものしか使わないけど、調べるとこれ便利やんというのが作られていたりするので、LTとかの場を使ってそういうのを調べるというのが、実は自分の作業の効率化にも良い方向に働いているのだなぁと感じました。
というわけで、今後もいろいろとやっていきたいものです。