【解説】map関数とpandas.Seriesのmapメソッドの違いを学ぶ | データサイエンス100本ノック【問54 回答】
当ページのリンクには広告が含まれています。
目次
この記事の対象者
・ Pythonのmap関数とpandas.Seriexのmapメソッドの違いを知りたい人
以降はデータサイエンス100本ノックの問題も題材にしながら学んでいきます。
データサイエンス100本ノックの始め方は、以下の記事を参考にしていただければと思います。
そもそも「関数」と「メソッド」の違いとは
pythonを学んできた型ならふと思う「関数とメソッドの違いってなんだ?」という点から掘り下げていきます。
先人の方がきちんと整理してくれていました。
【Python】関数とメソッドの違いを実例でわかりやすく解説
要約すると以下になります。
- メソッド: 特定のクラスでしか使えない。データ型に紐付いた関数。
- 例: replaceメソッドはlist(配列)には使えないが、str(文字列)には使える
- 関数: 幅広いオブジェクトに使える(特定のクラスで縛られない)。単独で呼び出せるもの。
- 例: print()等
map関数とpandas.Seriesにおけるmapメソッド
それでは本記事の主題であるmap
にフォーカスして整理します。
pythonには「map関数」と「mapメソッド」が存在します。
後者のmapメソッドは、pandasのSeries型に適用できるメソッドです。
それぞれ「map関数」と「mapメソッド」に分けて使い方を紹介します。
1. map関数
map関数は、list
の各要素に関数を適用する場合に使う関数です。
1 | # イテレータ(計算の方法を格納)を返す 計算は行わない |
イテレータとは複数の要素を順番に取り出す機能を持ったクラスを指します。この、要素を順番に取り出す機能を使うことで、for
ループを用いるよりも実行時間を短くすることができるので、膨大な要素を持つ配列に関数を適用したい場合にはmap()関数を用います。
このmap関数のように他の関数を引数にできる関数を高階関数と言います。
以下に例を示します。例えばa = [1, -2, 3, -4, 5]
という配列の各要素の絶対値を得るには、for
ループと絶対値を算出する関数であるabs()
を用いて、以下のように書きます。
1 | a = [1, -2, 3, -4, 5,] |
1 | [1, 2, 3, 4, 5] |
これをmap()
関数を用いると、以下のように簡潔に書くことができます。
1 | a = [1, -2, 3, -4, 5,] |
1 | [1, 2, 3, 4, 5] |
このようにlist()関数で囲むことによりmap()関数の適用結果(abs関数を適用した結果)を再度リストに格納することができます。
2. pandas.Seriesのmapメソッド
pandas.Seriesにおけるmapメソッドは、引数に辞書型を指定することも可能です。
その場合、要素の置換になります。
要素の置換は、過去にデータサイエンス100本ノックの第44問目でreplace
メソッドを使用しました。
しかし、こちらの記事によると、pandas.Seriesまたはpandas.DataFrameの列(=pandas.Series)のすべての要素を別の値に置換する場合、map()のほうが高速になるようです。
pandas.Seriesにおけるmapメソッドの使い方の例を紹介します。
1 | import pandas as pd |
この例を元に、データサイエンス100本ノックの第54問目を解いていきたいと思います。
第54問目: mapメソッドを用いたカテゴリ化
P-054: 顧客データデータフレーム(df_customer)の住所(address)は、埼玉県、千葉県、東京都、神奈川県のいずれかとなっている。都道府県毎にコード値を作成し、顧客ID、住所とともに抽出せよ。値は埼玉県を11、千葉県を12、東京都を13、神奈川県を14とすること。結果は10件表示させれば良い。
まずはdf_customer
の構造を確認します。
1 | df_customer.head(5) |
1 | customer_id customer_name gender_cd gender birth_day age postal_cd address application_store_cd application_date status_cd |
問題文には都道府県毎にコード値を作成し、顧客ID、住所とともに抽出せよ
、と記載されているので、df_customer
の顧客IDと住所のデータを抽出します。
1 | df_tmp = df_customer[['customer_id', 'address']] |
1 |
|
次に、都道府県ごとにコード値を作成します。値は、埼玉県を11, 千葉県を12, 東京都を13, 神奈川県を14とします。
このときaddress
カラムのstr型データからどのように都道府県の判別をすればよいかがポイントになります。
ここでは先頭の3文字を.str[0:3
で抽出し、抽出した文字列がそれぞれ埼玉県
, 千葉県
, 東京都
, 神奈川
となっているかどうかで判別していきます。
1 | df_prefecturecode = df_customer['address'].str[0:3].map({'埼玉県': '11', '千葉県': '12', '東京都': '13', '神奈川':'14'}) |
1 | 0 14 |
これで下準備が整いました。
最後に2つのデータフレームを結合し、顧客IDで、住所、そして都道府県ごとのコード値を出力します。
今回結合する2つのデータフレームには共通するカラムは存在しないので、merge
ではなくconcat
を用いて結合します。
1 | pd.concat([df_tmp, df_prefecturecode], axis=1).head(10) |
1 | customer_id address address |
これで完成です。
まとめ: 関数とメソッドの違いとmapを使ったカテゴリ化を学びました。
本記事は、「【Python】map関数とpandas.Seriesのmapメソッドの違いを学ぶ | データサイエンス100本ノック【問54 回答】」というテーマでまとめました。
本記事で紹介した方法を元に、データサイエンティストとしての知見を深めていただければと思います。
なお、データサイエンティストに必要な知識は、TechAcademyのデータサイエンスコースでの学習がおすすめです。