for文で繰り返し処理をかける際に、対象のデータが大きいと、処理するのにかなり時間がかかってしまっていました。
待てど暮らせど*のまま表示が変わらず、募るいらいらに対応するために、待ち時間表示と高速化の2つのチップスを紹介しようと思います。
前提:今回やりたいこと
pandasで20万行あるCSVファイルを読み込みました。(データフレームにはs1という名前を付ける)

targetカラムには、0~1までのfloat型の数字が入っていますが、すべての行に対して
・値が0.5より小さかったら0
・値が0.5より大きかったら1
という処理をかけたいです。(0.5ぴったしはデータに存在しない)
まず、最初にやった処理は以下の通り。
1 2 3 4 5 |
for i,target in enumerate(s1["target"]): if target < 0.5: s1.loc[i,"target"] = 0 else: s1.loc[i,"target"] = 1 |
すると「*」のまましばらく待つことになります。
この時2つの願望が生まれます。
①処理の進捗表示されたら便利だな
②そもそももっと処理早くならんのかね
これらを実現するTipsを今回紹介しようと思います!
①処理が今どれだけ進んでいるのかを表示したい
まずは、処理が現在どれだけ進行しているのかわからない、そもそもフリーズしてしまっているのか、といういらいらを解消するために、プログレスバーを表示する方法です。
使うのは「tqdm」です。
使い方はこちらの記事でわかりやすく解説されています。
ざっくりと説明すると、
from tqdm import tqdm でインストールし、、
for文の中にtqdmを組み込む。という感じです。
例)
1 2 3 4 5 |
for i in range(10000): → for i in range(tqdm(10000)): for target in targets: → for target in tqdm(targets): for target in enumerate(targets): → for target in enumerate(tqdm(targets)): |
これをやるとどうなるかというと、

こんな感じでプログレスバーが表示されました。便利!
②処理を高速化したい
先ほどの処理では、合計で14分強かかってしまっていました。

待てないこともないですが、早くなるなら早くしたいもの。
処理の高速化は、ループをかけるリストを、numpy配列に変換することで実現できます。

なんと1秒未満です。あっという間!
ちなみにですが、np.array()でnumpy配列に変換することができます。
np.arrayの()の中には、通常のリストや、pandas.seriesを入れることが可能です。
たった1行で高速に処理できるようになるなんてありがたすぎますね。
ということで、これからはforループで大量の処理を回すときにイライラせずにすみそうです。
最後まで読んでいただきありがとうございました。
おわり