1. ホーム
  2. python

[解決済み] Pandas DataFrameのパフォーマンス

2023-04-15 06:29:03

質問

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 と比較して再びひどく遅くなるでしょう。