【mapの使い方】lambda関数でPandas・リストを要素毎に処理する方法|Python

Python [文法解説]

map関数の基本構造

map関数を使用することで、Pandas Seriesまたはリストのを各要素毎に一括処理する関数です。

基本構造は下記の通りでそこまで複雑ではないのですが、「要素ごとに適用する関数」をどのように記述するかが馴染みがなくて、難しく感じる方が多いかと思います。

Pandas Seriesとリスト型で構造(変数の位置)が若干変わるので注意が必要です。

map変数の基本構造(変数がPandas Seriesの場合)
変数 . map (要素毎に適用する関数)

map変数の基本構造(変数がリスト型の場合)
map (要素毎に適用する関数, 変数)

使い方の解説

以降では、サンプルコードを用いてmap関数の使い方を解説していきます。

①変数がPandas Seriesの場合

Pandas Seriesとは、下記のようにDataFrame型変数の列名を指定した際の型です。

DataFrame型変数 [‘カラム名’]

このような形の場合、例えば下記のDataFrameの「col1」カラムに対して、「要素の値 × 5」の処理を行いたい場合のソースコードを紹介します。

col1col2
row102
row213
# ライブラリをインポート
import pandas as pd

# DataFrame型変数を作成
df = pd.DataFrame(data={'col1': [0, 1], 'col2': [2, 3]}, index=['row1', 'row2'])

# map関数を適用
ret = df['col1'].map(lambda x: x * 5)

# 結果出力
print(ret)

>>> row1    0
>>> row2    5
>>> Name: col1, dtype: int64

出力された値を確認すると、「col1」カラムの各要素の値が5倍されていることが分かりますね。
 ・0 × 5 = 0
 ・1 × 5 = 5

②変数がリスト型の場合

下記のリスト型変数に対して、「要素の値 × 5」の処理を行いたい場合のソースコードを紹介します。

> [0, 1]

# リスト型変数を作成
smpl_list = [0, 1]

# map関数を適用
ret = map(lambda x: x * 5, smpl_list)

# 結果出力
for i in ret:
    print(i)

出力された値を確認すると、先ほどの処理と同様に各要素の値が5倍されていることが分かりますね。
 ・0 × 5 = 0
 ・1 × 5 = 5

【注意】値を取り出す処理が若干面倒

↑のソースコードのように、map関数の適用結果を参照するにはforループを使用する必要があります。

なので、リスト型変数の各要素に対して任意の処理を行いたい場合は、内包表記」を使用することをおすすめします!

内包表記とは、

[変数を使用した式 for 変数 in リスト型変数]

のように記述することで、map関数のように各要素に対して任意の処理を行うことができます。

【Python】forループを1文で記述できる「内包表記」の使い方を解説」で詳しく解説しているので、気になる方は読んでみてください。

DataFrameの行・列ごとに処理を行う方法

ここまでは、Pandas Seriese・リスト型変数の要素毎に処理を行う方法を解説してきました。

こちらはmap関数を使用することで対応できるのですが、関連する関数にapply関数というものがあります。

これは、Pandas DataFrameを行・列ごとに一括処理してくれる関数です。

■apply関数の基本構造
変数 . apply (要素毎に適用する関数, axis=0 or 1)

apply関数については、「【applyの使い方】lambda関数でPandasを行・列毎に処理する方法 | Python」で詳細解説しているので、apply関数について知りたい方はぜひ読んでみてください!

forループを使用する代わりに、map関数・apply関数を使用することで、処理が速いコードを書けるようになりますよ。

コメント

タイトルとURLをコピーしました