Pandas.Seriesの各要素に対して関数を適用させるmap関数!

こんにちは!インストラクターのフクロウです!この記事では、pd.Seriesの各要素に関数を適用するメゾット、mapについて紹介します。pd.Series.mapはSeries型版の(ほかの関数でもよく見る)map関数です。

この説明で概要がわからない人、この記事を読みすすめてmapメソッドの使い方を覚えちゃいましょう!

目次

開発環境

この記事を書くために使った開発環境は以下のとおりです。

ライブラリのバージョンなど

  • OS=”Ubuntu 18.04.1 LTS”
  • Python 3.7.0
  • Pandas 0.23.4

OSが異なっても基本的には同じ操作で記事中のプログラムは再現できるので、試してみてください!

mapのAPI

Series.map(arg, # 適用したい関数
           na_action=None)

mapメソッドで覚えておきたいのは第一引数です。第一引数に、Seriesの各要素に適用したい関数を渡しましょう。詳しい使い方は次のセクションで!また、mapのAPIについての詳細な解説は、以下の公式ドキュメントに書かれています。

mapの使い方

ライブラリのimportとデータ作成

まずは必要なライブラリのimportとサンプルのSeriesを作ります。

In [1]: import numpy as np

In [2]: import pandas as pd

In [3]: X = np.arange(0,10)

In [4]: X = pd.Series(X)

In [5]: X
Out[5]:
0    0
1    1
2    2
3    3
4    4
5    5
6    6
7    7
8    8
9    9
dtype: int64

シンプルな使い方

mapメソッドは、Seriesの先頭要素から終わりの要素まで、関数を適用していく機能を持ちます。イメージとしては、for文でリストのすべての要素に対して処理を行う感じです。

例として、test関数(😁の吹き出しに、関数が受け取った要素を表示している形の文字列を返す機能)をmapメソッドに使ってみます。

In [6]: def test(x):
   ...:         # mapの中で使う関数の例です。
   ...:         return f"😁<{x}"

In [7]: X.map(test)
Out[7]:
0    😁<0
1    😁<1
2    😁<2
3    😁<3
4    😁<4
5    😁<5
6    😁<6
7    😁<7
8    😁<8
9    😁<9
dtype: object

Xの中には0~9の数字でした。これをmapを介して全てtest関数に通した結果がOut[9]の表示です。しっかり最初から最後まで適用できているようですね。

また、mapでリストを返す関数を扱う場合の例も見ておきましょう。

In [8]: def test2(x):
   ...:         return [x, x**x]

In [9]: X.map(test2)
Out[9]:
0            [0, 1]
1            [1, 1]
2            [2, 4]
3           [3, 27]
4          [4, 256]
5         [5, 3125]
6        [6, 46656]
7       [7, 823543]
8     [8, 16777216]
9    [9, 387420489]
dtype: object

例えば2要素のリストを返す関数があったとき、もしかしたらDataFrameが出力されないかな?って思うかもしれません。

ですが残念ながら、このようなコンテナ型(複数要素をもったデータ型)はすべてobject型というdtype扱いになり、Series型が返ってきています。

これはtest2関数がSeries型を返すとしても、この関数をmapで適用した出力は「Series型を内包したSeries型」になります。

まとめ

この記事では、pandas.Series.mapメソッドについて紹介しました。

mapメソッドの要点

  • mapメソッドはSeries型の各要素に引数に渡された関数を適用する機能


DataFrameのapply、applymapと並んで覚えておきたいPandasの基本操作なので、ぜひ使ってみてください!

この記事を書いた人

第一言語はPythonです。
皆さんRustやりましょう。

目次