[解決済み] Pandas DataFrameのパフォーマンス
質問
Pandasは本当に素晴らしいですが、Pandas.DataFrameから値を取得することがいかに非効率であるかに本当に驚いています。 以下のおもちゃの例では、DataFrame.ilocメソッドでさえ、辞書よりも100倍以上遅いのです。
疑問です。ここでの教訓は、値を調べるには辞書の方が良いということだけでしょうか? はい、私はそれがまさにそのために作られたものであることを理解しました。 しかし、DataFrame のルックアップ パフォーマンスについて何か見逃しているものがあるのではないかと思っています。
この質問は、quot;asking" よりも "musing" であることを理解していますが、これに関する洞察または展望を提供する回答を受け入れます。 ありがとうございます。
import timeit
setup = '''
import numpy, pandas
df = pandas.DataFrame(numpy.zeros(shape=[10, 10]))
dictionary = df.to_dict()
'''
f = ['value = dictionary[5][5]', 'value = df.loc[5, 5]', 'value = df.iloc[5, 5]']
for func in f:
print func
print min(timeit.Timer(func, setup).repeat(3, 100000))
値 = 辞書[5][5]です。
0.130625009537
値 = df.loc[5, 5] です。
19.4681699276
値 = df.iloc[5, 5] です。
17.2575249672
どのように解決するのですか?
dictはDataFrameに対して、自転車が車であるようなものです。 自転車を10フィート漕ぐ方が、車をスタートさせ、ギアを入れるより速い、などなど。しかし、もしあなたが1マイル進む必要があるのなら、車の方が勝っています。
ある種の小さな、的を射た目的には、ディクトの方が速いかもしれません。 そして、それがすべてであるならば、確かにディクトを使いましょう! しかし、DataFrame のパワーと贅沢さを必要とするのであれば、dict はその代用にはならないでしょう。データ構造がまずニーズを満たさなければ、速度を比較することは無意味です。
例えば、より具体的に言うと、dictは列にアクセスするには良いですが、行にアクセスするのにはあまり便利ではありません。
import timeit
setup = '''
import numpy, pandas
df = pandas.DataFrame(numpy.zeros(shape=[10, 1000]))
dictionary = df.to_dict()
'''
# f = ['value = dictionary[5][5]', 'value = df.loc[5, 5]', 'value = df.iloc[5, 5]']
f = ['value = [val[5] for col,val in dictionary.items()]', 'value = df.loc[5]', 'value = df.iloc[5]']
for func in f:
print(func)
print(min(timeit.Timer(func, setup).repeat(3, 100000)))
イールド
value = [val[5] for col,val in dictionary.iteritems()]
25.5416321754
value = df.loc[5]
5.68071913719
value = df.iloc[5]
4.56006002426
つまり、リストのディクショナリーは、行の取得において
df.iloc
. この速度低下は、列の数が増えるにつれて大きくなります。(列の数は、自転車の例えでいうところの足の数のようなものです。距離が長くなればなるほど、車の方が便利になる...)
これは、リストのdictがDataFrameよりも便利でない/遅い場合のほんの一例です。
他の例としては、行のDatetimeIndexを持っていて、特定の日付の間のすべての行を選択したい場合です。DataFrameでは
df.loc['2000-1-1':'2000-3-31']
リストのディクショナリーを使用する場合、そのための簡単なアナログはありません。そして、正しい行を選択するために使用する必要がある Python のループは、DataFrame と比較して再びひどく遅くなるでしょう。
関連
-
[解決済み] PandasでDataFrameの行を反復処理する方法
-
[解決済み] 列の値に基づいてDataFrameから行を選択するにはどうすればよいですか?
-
[解決済み] Pandasのカラム名のリネーム
-
[解決済み] Pandas DataFrameからカラムを削除する
-
[解決済み] Pandasのデータフレームで複数の列を選択する
-
[解決済み] Pandas DataFrameの行数を取得する方法は?
-
[解決済み] 既存のDataFrameに新しい列を追加する方法は?
-
[解決済み] 一行ずつ追加してPandas Dataframeを作成する
-
[解決済み] 辞書のリストをpandasのDataFrameに変換する
-
[解決済み】Pandas DataFrameのカラムヘッダからリストを取得する。
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] PythonからSMTPを使用してメールを送信する
-
[解決済み] サブフォルダからのインポートモジュール
-
[解決済み] あるオブジェクトが数であるかどうかを確認する、最もパイソン的な方法は何でしょうか?
-
[解決済み] Cythonのコードを含むPythonパッケージはどのように構成すればよいのでしょうか?
-
[解決済み] Django で全てのリクエストヘッダを取得するにはどうすれば良いですか?
-
[解決済み] PyQtアプリケーションのスレッド化。QtスレッドとPythonスレッドのどちらを使うか?
-
[解決済み] matplotlib でプロットの軸、目盛、ラベルの色を変更する方法
-
[解決済み] Pandasのデータフレーム内の文字列を'date'データ型に変換するにはどうしたらいいですか?
-
[解決済み] Pythonの検索パスを他のソースに展開する
-
[解決済み] Pythonの辞書にあるスレッドセーフについて