「100万行と30列のデータフレームがあるとしましょう。 データフレームに列を追加したいのですが、その値は「前の30列のうち最も頻繁な値」です。私はまた、 "前の30列の中で2番目に多い値"を追加したいと思います。連続して最も頻繁な値と2番目に頻繁な値を取得するにはどうすればよいですか?
"以前の30列の中で最も頻繁に使われる値"についてdf.modeとても遅いです。
これをベクトル化して高速にすることはできますか?
「100万行と30列のデータフレームがあるとしましょう。 データフレームに列を追加したいのですが、その値は「前の30列のうち最も頻繁な値」です。私はまた、 "前の30列の中で2番目に多い値"を追加したいと思います。連続して最も頻繁な値と2番目に頻繁な値を取得するにはどうすればよいですか?
"以前の30列の中で最も頻繁に使われる値"についてdf.modeとても遅いです。
これをベクトル化して高速にすることはできますか?
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のバージョンがそれほど効率が悪いと私は思う。