私は、1500 万行を超えるデータ フレームに対して定期的に pandas 操作を実行しており、特定の操作の進行状況インジケーターにアクセスできるようにしたいと考えています。
pandas の split-apply-combine 操作用のテキストベースの進行状況インジケーターは存在しますか?
たとえば、次のような場合です。
df_users.groupby(['userID', 'requestDate']).apply(feature_rollup)
ここで、はfeature_rollup
、多くの DF 列を受け取り、さまざまな方法で新しいユーザー列を作成する、やや複雑な関数です。これらの操作は、大きなデータ フレームでは時間がかかることがあるため、iPython ノートブックで進行状況を更新するテキスト ベースの出力が可能かどうかを知りたいです。
これまで、Python の標準的なループ進行状況インジケーターを試してきましたが、それらは pandas と意味のある方法でやり取りしません。
pandas ライブラリ/ドキュメントで、split-apply-combine の進行状況を知ることができる何かを見落としているのではないかと思っています。単純な実装では、関数がapply
動作しているデータ フレーム サブセットの合計数を確認し、それらのサブセットの完了した割合として進行状況を報告することになるでしょう。
これはおそらくライブラリに追加する必要があるものでしょうか?
ベストアンサー1
多くの要望により、( )pandas
のサポートを追加しました。他の回答とは異なり、これによってパンダの速度が著しく低下することはありません。次に、の例を示します。tqdm
pip install "tqdm>=4.9.0"
DataFrameGroupBy.progress_apply
import pandas as pd
import numpy as np
from tqdm import tqdm
# from tqdm.auto import tqdm # for notebooks
# Create new `pandas` methods which use `tqdm` progress
# (can use tqdm_gui, optional kwargs, etc.)
tqdm.pandas()
df = pd.DataFrame(np.random.randint(0, int(1e8), (10000, 1000)))
# Now you can use `progress_apply` instead of `apply`
df.groupby(0).progress_apply(lambda x: x**2)
これがどのように動作するか(そして独自のコールバックのためにこれをどのように変更するか)に興味がある場合は、GitHub の例、PyPIの完全なドキュメント、またはモジュールをインポートして を実行しますhelp(tqdm)
。サポートされているその他の関数にはmap
、applymap
、aggregate
、 などがありますtransform
。
編集
元の質問に直接答えるには、次のように置き換えます。
df_users.groupby(['userID', 'requestDate']).apply(feature_rollup)
と:
from tqdm import tqdm
tqdm.pandas()
df_users.groupby(['userID', 'requestDate']).progress_apply(feature_rollup)
注意: tqdm <= v4.8 : tqdm のバージョンが 4.8 未満の場合は、代わりに以下をtqdm.pandas()
実行する必要があります。
from tqdm import tqdm, tqdm_pandas
tqdm_pandas(tqdm())