【pandas】applymap 関数の数値処理と速度

applymap()を使用した数値処理と速度を確認しています.

事前準備

まずはサンプルのDataFrameを作成します.


import numpy as np
import pandas as pd

# DataFrameの作成
df = pd.DataFrame([[1, 2], [3, 4]], columns=['col1', 'col2'])
df
col1 col2
0 1 2
1 3 4

DataFrameの各要素を10倍にする

DataFrameの各要素を10倍にする方法として以下の2種類を見てみましょう.
得られる結果はいずれも同じです.


df * 10
col1 col2
0 10 20
1 30 40

# dfの各要素に対して10倍の処理を適用
df.applymap(lambda x: x * 10)
col1 col2
0 10 20
1 30 40

処理速度の比較

「DataFrame の各要素を10倍」という処理ではdf * 10applymap()を使用するパターンの2パターンがありました.これらは処理速度の問題で前者の方が望ましいとされています1が,どの程度違うのか簡単に検証してみましょう.

まず,1000x50のDataFrameを作成します.


m = 1000
n = 50

df_large = pd.DataFrame(np.random.normal(5, 2, m * n).reshape(m, n))
df_large.shape
(1000, 50)

上のコードで作成したDataFrameの各要素を10倍する処理をdf * 10applymap()の2パターンで比較します.

以下のコードでは100回の処理を3回繰り返した場合における処理速度の平均と標準偏差を見ています.2


%%timeit -r 3 -n 100

# 100回の処理を3回繰り返した時の処理時間
df_large * 10
33.1 µs ± 6.35 µs per loop (mean ± std. dev. of 3 runs, 100 loops each)

%%timeit -r 3 -n 100

# 100回の処理を3回繰り返した時の処理時間
df_large.applymap(lambda x: x * 10)
6.97 ms ± 78.4 µs per loop (mean ± std. dev. of 3 runs, 100 loops each)

df * 10の方が200倍以上早いですね・・・
数値計算では公式どおりapplymap()を使うことは避けましょう.

ひとこと

今回確認したDataFrameはそれほど大きいDataFrameではありませんが,かなりの差が出ました.もっと大きいDataFrameだと目も当てられない速度差になりそうです.

関連記事

applymap()で文字列を扱う記事はこちらです.


  1. 公式 Reference でそのように言及されています. 

  2. Jupyterのマジックコマンドを使用しています.