pandas tips データフレームのループを倍高速化する
目次 Pandasのデータ処理の概要 Pandasのループ処理改善 一般的なループ(Loop) iterrows() apply() Pandas ベクトル化(Pandas Vectorization) Numpy ベクトル化(Numpy Vectorization) Pandasのループ処理改善の比較 Pandasのデータ処理の概要 pandasで大量データを扱う場合、処理速度が遅く困る事があります。公式ドキュメントではパフォーマンス向上のために Cython や Numba を使う方法を記載しています。今回の記事はデータフレームのループを倍高速化する方法を解説と実験したいと思います。 最初はベンチマークとして一般的ループを実行します。 Pandasのループ処理改善 実験の環境: 環境:Colab(Webブラウザからプログラミング言語Python) データセット:2019年シーズンのサッカープレミアリーグの試合データ データ処理:特定のチームの試合が引き分けかどうか新しい列作成 評価:データ処理の速さ data.worldからデータを読み込みます。 サッカーの結果かなら、特定のチームの試合で引き分けかどうか計算します。 import pandas as pd df = pd.read_csv(‘https://query.data.world/s/dz7yh6j26rhswrdlbx23eyebqpisvn’) team = ‘Tottenham’ df 1. Ilocを用いた一般的なループ(Loop) ループを使用する場合は、オブジェクト全体を反復処理します。 Pythonはメリットをいかせず非常に遅いです。 def soc_loop(df, TEAM): df[‘Draws’] = 99999 for row in range(0, len(df)): if ((df[‘HomeTeam’].iloc[row] == TEAM) & (df[‘FTR’].iloc[row] == ‘D’)) | \ ((df[‘AwayTeam’].iloc[row] == TEAM) & (df[‘FTR’].iloc[row] == ‘D’)): df[‘Draws’].iloc[row] = ‘Draw’ elif ((df[‘HomeTeam’].iloc[row] == TEAM) & (df[‘FTR’].iloc[row] != ‘D’)) | \ ((df[‘AwayTeam’].iloc[row] == TEAM) & (df[‘FTR’].iloc[row] != ‘D’)): df[‘Draws’].iloc[row] = ‘No_Draw’ else: df[‘Draws’].iloc[row] = ‘No_Game’ DataFrameでプレミアリーグからすべての試合を確認する必要があり、if文の分岐で彼らがホームチームかアウェイチームかを確認する必要があります。Loopは86.5 ミリ秒かかりました。 …