クラウドエンジニアのノート

情報技術系全般,自分用メモを公開してます。

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は使わなくても平気みたいですね

検索条件を等号から不等号へと変えてみましたが結果は同じでした