2016-10-22 5 views
1

私はpandasnumpyにかなり新しく、いくつかのことをする最善の方法を見つけようとしています。パンダのデータフレームにベクトル化された関数を適用できますか?

今私はdataframeのすべての行で関数を呼び出そうとしています。この関数に3つのnumpy配列を渡すと非常に高速ですが、dataframeapplyを使用すると非常に遅いです。

私の推測では、numpyは、ベクトル化された関数を最初のケースで使用し、2番目のケースでは使用していないと思われます。その最適化をpandasに使用する方法はありますか?基本的には、擬似コードではfor row in frame: func(row['a'], row['b'], row['c'])のようなものをapplyがやっていると思うが、それはfunc(col['a'], col['b'], col['c'])としたい。

ここに私がしようとしているものの例があります。

import numpy as np 
import pandas as pd 
from scipy.stats import beta 

count = 100000 

# If I start with a given dataframe and use apply, it's very slow 

df = pd.DataFrame(np.random.uniform(0, 1, size=(count, 3)), columns=['a', 'b', 'c']) 
df.apply(lambda frame: beta.cdf(frame['a'], frame['b'], frame['c']), axis=1) 

# However, if I split out each column into a numpy array, this is very fast. 

a = df['a'].as_matrix() 
b = df['b'].as_matrix() 
c = df['c'].as_matrix() 

beta.cdf(a, b, c) 

# But at this point I've lost the context of the dataframe. 
# I would like to keep the results in a new column for further processing 
+0

ベクトル化は機能固有のものです。ですから、あなたは 'beta.cdf'だけをベクトル化しようとしていますか? – Divakar

+1

beta.cdfはすでに配列(とSeries)を受け入れていますが、代わりにapplyを使用するのはなぜですか? – ayhan

+2

なぜ 'beta.cdf(df.a、df.b、df.c)'を呼び出さないのですか? – BrenBarn

答えて

4

applyを使用しようとする理由は不明です。あなたはただbeta.cdf(df.a, df.b, df.c)をすることができます。

+0

もう一度ありがとうございます。私は 'dataframe'カラムをベクター化された関数に渡すことができないことを理解していませんでした。 –

+0

できますよ!パンダの各列を呼び出すデータフレームはパンダシリーズです。 – Parfait

関連する問題