PS:誰かが非常に良い質問をしました。各ループでより複雑な操作を使用すると、ベクトル化を実装するのは難しいようです。私の提案は、可能な限りベクトル化操作に分割することです。そうでない場合は、numpyを使用してハードに書き込み、次にnumbaパッケージを使用すると加速します。
テキスト:
PythonとPandasを使用したことがある場合は、おそらくforループを使用していくつかのデータ分析操作を実行したことがあります。残念ながら、ほとんどのPython初心者が使用する添え字ループステートメントは実際には非常に遅く、小さなデータセットでも多くの実行時間を消費します。このコラムの以前の記事のいくつかはすでにこの議論に関係しています。この記事では、中国の兄弟が5つの異なるForループメソッドを水平方向にさらに具体的に比較して、通常作成するさまざまなForループの効率について全員に明確にしました。
注:後でコードに表示されるdfは、testと呼ばれる列が1つしかないデータフレームです。さらに、各メソッドの下のコードは使用例にすぎず、速度のテストに使用されるコードと完全に一致しているわけではありません。元のテストコードは次のとおりです。
方法1:添え字サイクル(速度グレード:)
df1 = df
for i in range(len(df)):
if df.iloc[i]['test'] != 1:
df1.iloc[i]['test'] = 0
下付き文字ループは、下付き文字シーケンスをループし、ilocを介してデータを継続的に取得することです。この方法は最も一般的に使用されますが、初心者でも最も遅くなります。テスト例では約21.9秒かかります。
方法2:Iterrowsループ(スピードグレード:)
i = 0
for ind, row in df.iterrows():
if row['test'] != 1:
df1.iloc[i]['test'] = 0
i += 1
ループ方式は、iterrowをループすることです。ここで、indとrowは、それぞれ各行のインデックスとコンテンツを表します。テスト例には約0.07秒かかります。これは、添え字のサイクル速度の321倍です。
方法3:サイクルを適用します(速度レベル:)
df1['test'] = df['test'].apply(lambda x: x if x == 1 else 0)
Applyは、パンダで一般的に使用される関数です。通常の使用法は、ラムダ無名関数をインライン化して、データフレームの各行がループで処理されるようにすることです。テスト例では、適用速度は0.027秒で、添え字ループの811倍です。
方法4:パンダの組み込みベクトル化関数(速度グレード:)
res = df.sum()
Pandasには、sum、meanなどの多数の組み込みベクトル化関数が用意されており、列の合計と平均をすばやく計算できます。テスト例では、速度は0.00236秒で、添え字サイクルの9280倍です。
方法5:Numpyベクトル化関数(速度グレード:)
df_values = df.values
res = np.sum(df_values)
最後の方法は、PandasデータをNumpy Arrayに変換してから、Numpyの組み込み関数を使用してベクトル化することです。テスト例では、速度は0.000305sであり、添え字サイクルの71800倍です。
以下は、前のリンクからの詳細な速度比較チャートです。
出典:
[1] https://stackoverflow.com/questions/52673285/performance-of-pandas-apply-vs-np-vectorize-to-create-new-column-from-existing-c
[2] https:// en .wikipedia.org / wiki / Locality_of_reference