どうもこんにちはヒゲメガネです。
今回は「pandas dataframe でapply を使ってみた」という内容をお伝えしたいと思います。
最近取り組んでいる分析作業の中でpandasを利用しており、作業の中で利用したapplyメソッドについて少し理解がふわっとしていたので、自分の理解を深める意味でもこちらでアウトプットしようと思った次第です。
applyとは
今回利用したapplyメソッドについてですが、PandasのDataFrame(以降DF)が持つメソッドの1つです。できることとしては、DFに対して関数を適用することができます。
と言っても知らない人からしたらなんのことやら、「サッパリ妖精」が飛んでいる人も多いと思います。
今回は実際に試したことと、分かったことなどを画像を添えて簡単にお伝えできたらと思います。
applyで試したこと(本題)
さて本題です。
まず試した内容として、下記のようなテーブルを用意して「年齢が平均より上なら1、そうでなければ0」というフラグのカラムを作成することです。
データ:
ただ、実は下記のようなコードですぐできます。
ただ、それではダメなのです。
applyを使いたいのです。そんな熱い思いをもって取り組みました。(たぶん)
ちなみに「1」「0」化させるのは下記のような方法でもできます。
が、今回はとにもかくにもapplyです。apply以外は認めません。
また、単純にforループに比べた場合は処理速度が速いという点でもapplyをオススメします。
applyで書いたコード
長くなってしまったのでサクサク行きます。
はい、下記のコードが実際にapply使って書いたコードです。
2行目の「age_ave」は見た目上比較のために作ったカラムとなり、実際にapplyでフラグを作っているのは5行目の「ave_comparison」になります。
値を見てみると、「age」が「age_ave」より高いレコードは「age_comparison」にて「1」となっています。
成功です。やったね
applyメソッドは、引数の中に関数を渡すことで、DFのデータに対して関数を適用することができます。
上記ではlambda関数(無名関数)を利用していますが、事前に定義した関数だとどうなるでしょうか。
それをしたのが下記になります。
先ほどと同じ結果ですね。やったね
ちなみにapplyの引数に渡す関数名ですが、関数だとついつい「()」を付けたくなってしまいますが、つけるとエラーになるので注意が必要です。
引数に「x」を渡してみてもエラー
applyの引数について
applyメソッド自体の引数についてですが、下記のようになっておりオプションの引数も存在します。
apply(self, func, axis=0, raw=False, result_type=None, args=(), **kwds)
このあといくつかはご紹介しますが、
オプション引数の詳細については下記のドキュメントを参考にされるとよいかと思います。
引用元:
こちら
apply内で適用させる関数の引数について
最後に、apply内で適用させる関数の引数の入り方、複数の引数の指定方法についてお話します。
まず先ほどの例でいうと、下記のスクリプトの場合、関数「ave_comparison」の引数「x」にはカラム「age」の各行の値が入ってきます。
その入ってきた値とカラム「age」の平均の値を比較しているわけですね。
上記のパターンとは違うバージョンのコードも見てみましょう。
データ:
パターン①:列名を指定しない
各列ごとに値が出力されます。
apply自体のオプション引数のオプション引数である「axis」を「1」にすると各行ごとの値が出てきます。
中でカラムを指定することも可能
パターン②:列名を指定する
指定した列の値が出力されます。
ちなみに前述したオプション「axis」はこのパターンでは「0(列方向)」に固定され、「1(行方向)」の指定はできません。
パターン③:適用関数に複数の引数がある場合
オプション引数「args」にタプル形式で値を渡します。
また、第一引数はDFのデータが勝手に入るため、指定するのは第二以降の引数になります。
下記の場合「b=2」「c=3」の関係性になります。
また、「args」タプル形式で値を渡す関係で、指定する引数が第二引数分しかない場合は「(2,)」と末尾にカンマを付ける必要があるため注意が必要です。
その他、「args」以外に、「b=2」とキーワード引数の形で指定しても同様の結果が得られます。
apply まとめ
今回はPandas DataFrameのapplyメソッドについてお伝えさせていただきました。
思ったより長くなってしまった…。
applyは、データに対して複雑な処理をしたい場合などにとても役に立つ便利なメソッドだなと思います。
ただ、個人的にはDFからの値の渡され方などのところで最初つまづいたこともあり、そのあたりをもっと把握したいというところと、オプション引数の理解も深めて今後ももっと極めていきたいと思います。
今回は自分の勉強の意味合いもある記事でしたが、至急applyを使わないといけない状況の方や、そうでもないけど興味ある方、その他全世界のみなさんの参考になれば幸いです。