2016-05-24 4 views
0

「100万行と30列のデータフレームがあるとしましょう。 データフレームに列を追加したいのですが、その値は「前の30列のうち最も頻繁な値」です。私はまた、 "前の30列の中で2番目に多い値"を追加したいと思います。連続して最も頻繁な値と2番目に頻繁な値を取得するにはどうすればよいですか?

"以前の30列の中で最も頻繁に使われる値"についてdf.modeとても遅いです。

これをベクトル化して高速にすることはできますか?

答えて

0

df.mode(axis=1)は既にベクター化されています。しかし、それがどのように機能するか考えてみてください。それはNumPyでCオーダーと呼ばれる「行優先順位」の恩恵を受けることを意味する、各行ごとに独立して動作する必要があります。 Pandas DataFrameは常に列メジャーオーダーです。つまり、1つの行のモードを計算するために30個の値を取得すると、30ページのメモリに触れる必要があり、効率的ではありません。

したがって、プレーンNumPy 2D配列にデータを読み込み、それが高速化するのに役立つかどうかを確認してください。そうすべき。

私は1.5 GHzのラップトップでこれを試してみました:

x = np.random.randint(0,5,(10000,30)) 
df = pd.DataFrame(x) 
%timeit df.mode(axis=1) 
%timeit scipy.stats.mode(x, axis=1) 

をデータフレームの道は6秒かかり、scipyのダウンロード(行優先)方法は10K行の16ミリ秒かかるのに対し、(!)。 SciPyでさえも、主要な順番ではそれほど遅くはないので、Pandasのバージョンがそれほど効率が悪いと私は思う。

関連する問題