1
は、私は次の計算を実行する必要があります。user_product
iが生成する新しいカラムがあるパンダの列の線形結合を効率的に計算する方法は?
priors['user_product'] = priors.eval('product_id + user_id*100000')
。 事前分布のデータフレームが巨大であるため、計算は時間がかかるが(正確には、3000000行を持っている)
は、私は次の計算を実行する必要があります。user_product
iが生成する新しいカラムがあるパンダの列の線形結合を効率的に計算する方法は?
priors['user_product'] = priors.eval('product_id + user_id*100000')
。 事前分布のデータフレームが巨大であるため、計算は時間がかかるが(正確には、3000000行を持っている)
あなたは高速したい場合は、numpy
またはnumexpr
または通常pandas
pandas
priors['user_product'] = priors.product_id + 100000 * priors.user_id
numpy
priors['user_product'] = priors.product_id.values + 100000 * priors.user_id.values
numexpr
pid = priors.product_id.values
uid = priors.user_id.values
priors['user_product'] = numexpr.evaluate('pid + 100000 * uid')
タイミング
n = 3000000
priors = pd.DataFrame(dict(product_id=np.random.rand(n), user_id=np.random.rand(n)))
%timeit priors['user_product'] = priors.eval('product_id + 100000 * user_id')
%timeit priors['user_product'] = priors.product_id.values + 100000 * priors.user_id.values
%timeit priors['user_product'] = priors.product_id + 100000 * priors.user_id
10 loops, best of 3: 31.6 ms per loop
100 loops, best of 3: 17.6 ms per loop
100 loops, best of 3: 18.5 ms per loop
%%timeit
pid = priors.product_id.values
uid = priors.user_id.values
priors['user_product'] = numexpr.evaluate('pid + 100000 * uid')
100 loops, best of 3: 13.6 ms per loop
'事前確率[ 'user_product'] =事前確率[ 'PRODUCT_ID'] +事前確率[ 'USER_ID'] * 100000'はslowierですか? – jezrael
何らかの理由で、あなたが言及した方法で、パンダ経由で計算するのは永遠にかかりました。 Evalはまた問題を引き起こしました。 pandasのドキュメントを見ると、ライブラリがインストールされている場合、numexprをバックエンドとして使用してevalを実現しました。したがって、すぐにnumexprをインストールすると、はるかに高速な計算が可能になりました。 – siebenheaven