applymap()
を使用した数値処理と速度を確認しています.
- 公式 Reference: pandas.DataFrame.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 * 10
とapplymap()
を使用するパターンの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 * 10
とapplymap()
の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だと目も当てられない速度差になりそうです.