この記事では、PythonにおけるPandasというライブラリで表形式データに対してデータ加工をする際に使用する「apply, map, applymap」の機能を比較しました。データサイエンティストやエンジニアの方々はぜひ参考にしてください。
まとめ表
各機能を比較したまとめ表は下記の通りになります。
比較基準 | apply | map | applymap |
---|---|---|---|
Series(列)への対応 | ○ | ○ | × |
DataFrame(表)への対応 | ○ | × | ○ |
複数引数の関数の使用 | ○ | × | × |
辞書による変換 | × | ○ | × |
listへの対応(組み込み関数) | × | ○ | × |
結論としては、次の通りになります。
- 基本的には多機能な apply がおすすめ。
- 辞書による変換を行いたい場合は map がおすすめ。
- applymap は、全ての機能がapplyに包括されているため、使用する機会はほとんどない。
各関数の実装方法
ここからはより詳しく各機能の違いを理解するために、実装方法を示していきます。
サンプルデータの作成
まずpandasをインポートして、サンプルデータを作成します。
import pandas as pd
# サンプルデータの作成
df = pd.DataFrame({
"name": ["A", "B", "C"],
"nickname": ["a", "b", "c"],
})
print(df)
# | name | nickname |
---|---|---|
1 | A | a |
2 | B | b |
3 | C | c |
関数の定義
次に、これから各列もしくは表全体に対して実行する処理を関数として定義します。
add_suffix
関数は、入力された文字列に対して「さん」を付与して、文字列を返す関数です。
add_suffix_custom
関数は、入力された一つ目の文字列に対して、二つ目の文字列を付与して、文字列を返す関数です。
# 関数の定義(lambdaでも代替え可能)
def add_suffix(x: str) -> str:
return x + "さん"
def add_suffix_custom(x: str, suffix: str) -> str:
return x + suffix
1. applyのできること
applyを用いると、以下のことが実現できます。
mapとapplymapとは異なり、SeriesにもDataFrameにも両方対応している上、args
という引数に配列やタプルを渡すことで、複数の引数を関数に渡すことができます。
- Series(列)への対応
- DataFrame(表)への対応
- 複数引数の関数の使用
# 1. applyのできること
df["name"].apply(add_suffix) # Series(列)への対応
df.apply(add_suffix) # DataFrame(表)への対応
df["name"].apply(add_suffix_custom, args=["さん"]) # 複数引数の関数の使用
# | name |
---|---|
1 | Aさん |
2 | Bさん |
3 | Cさん |
# | name | nickname |
---|---|---|
1 | Aさん | aさん |
2 | Bさん | bさん |
3 | Cさん | cさん |
2. mapのできること
mapを用いると、以下のことが実現できます。
mapでは辞書を渡すことができます。そのため、対応表などが静的に決まっている場合は非常に便利です。
また、pandasからは少し話が逸れますが、組み込み関数としてmapという関数が存在するため、listに対して処理を実行することもできます。
- Series(列)への対応
- 辞書による変換
- listへの対応(組み込み関数)
# 2. mapのできること
df["name"].map(add_suffix) # Series(列)への対応
df["name"].map({"A": "Aさん", "B": "Bさん", "C": "Cさん"}) # 辞書による変換
list(map(add_suffix, df["name"].to_list())) # listへの対応(組み込み関数)
# => ["Aさん", "Bさん", "Cさん"]
# | name |
---|---|
1 | Aさん |
2 | Bさん |
3 | Cさん |
3. applymapのできること
applymapを用いると、以下のことが実現できます。
applymapは、全ての機能がapplyに包括されているため、使用する機会はほとんどありません。
明示的に「DataFrame全体に対して処理をしていますよ」と示したい時にのみ有効だと考えられます。
- DataFrame(表)への対応
# 3. applymapのできること
df.applymap(add_suffix) # DataFrame(表)への対応
# | name | nickname |
---|---|---|
1 | Aさん | aさん |
2 | Bさん | bさん |
3 | Cさん | cさん |
サンプルコード(全文)
import pandas as pd
# サンプルデータの作成
df = pd.DataFrame({
"name": ["A", "B", "C"],
"nickname": ["a", "b", "c"],
})
# 関数の定義(lambdaでも代替え可能)
def add_suffix(x: str) -> str:
return x + "さん"
def add_suffix_custom(x: str, suffix: str) -> str:
return x + suffix
# 1. applyのできること
df["name"].apply(add_suffix) # Series(列)への対応
df.apply(add_suffix) # DataFrame(表)への対応
df["name"].apply(add_suffix_custom, args=["さん"]) # 複数引数の関数の使用
# 2. mapのできること
df["name"].map(add_suffix) # Series(列)への対応
df["name"].map({"A": "Aさん", "B": "Bさん", "C": "Cさん"}) # 辞書による変換
list(map(add_suffix, df["name"].to_list())) # listへの対応(組み込み関数)
# 3. applymapのできること
df.applymap(add_suffix) # DataFrame(表)への対応
最後に
いかがだったでしょうか?
この記事を通して、少しでもあなたの困りごとが解決したら嬉しいです^^
おまけ(お知らせ)
エンジニアの仲間(データサイエンティストも含む)を増やしたいため、公式LINEを始めました🎉
「一緒に仕事をしてくれる方」「友だちとして仲良くしてくれる方」は、友だち追加をしていただけますと嬉しいです!
(仲良くなった人たちを集めて、「ボードゲーム会」や「ハッカソン」や「もくもく会」もやりたいなと考えています😆)
とはいえ、みなさんにもメリットがないと申し訳ないので、特典を用意しました!
友だち追加後に、アンケートに回答してくれた方へ「エンジニア図鑑(職種20選)」のPDFをお送りします◎
