pandasで行検索するときの速度比較
pandasで行検索
忙しい人向け
結論から言うと,apply
, map
, query
を使うよりも ==
, <=
等の等号不等号を使った検索の方が早いです.
dfを定義
import pandas as pd df = pd.DataFrame({"col1":list(range(500000)), "col2":list(range(500000)), "col3":list(range(500000))}) df.shape # (500000,3) # df中身 col1 col2 col3 0 0 0 0 1 1 1 1 2 2 2 2 3 3 3 3 4 4 4 4 .... 499995 499995 499995 499995 499996 499996 499996 499996 499997 499997 499997 499997 499998 499998 499998 499998 499999 499999 499999 499999
検索条件が1つのとき
apply
df[df['col1'].apply(lambda x: x == 1000)]
Wall time: 160 ms
map
df[df['col1'].map(lambda x: x == 1000)]
Wall time: 159 ms
query
df.query('col1==1000')
Wall time: 33.9 ms
そのまま(名称がわかりません)
df[df['col1'] == 1000]
Wall time: 2.02 ms
圧倒的そのままやる方が早い
検索条件が2つのとき
apply
df[df.apply(lambda x: x['col1'] == 1000 and x['col2'] == 1000, axis=1)]
Wall time: 7.79 s
map
- dfに対してやる方法があれば教えて頂きたいです
query
df.query('col1==1000 & col2==1000')
Wall time: 8.68 ms
そのまま
df[(df['col1'] == 1000) & (df['col2'] == 1000)]
Wall time: 3.44 ms
applyがdfに対してだと急に遅くなった
結局,2つでもそのままやる方が早いらしい
検索条件が3つのとき
apply
df[df.apply(lambda x: x['col1'] == 1000 and x['col2'] == 1000 and x['col3'] == 1000, axis=1)]
Wall time: 8.14 s
query
df.query('col1==1000 & col2==1000 & col3==1000')
Wall time: 9 ms
そのまま
df[(df['col1'] == 1000) & (df['col2'] == 1000)& (df['col3'] == 1000)]
Wall time: 5.03 ms
結局そのままが早い
結論
pandasから行でデータを抽出するときはapply,map,queryは使わなくても平気みたいですね
検索条件を等号から不等号へと変えてみましたが結果は同じでした