2016-10-22 2 views
1

저는 pandasnumpy을 처음 접했고 몇 가지 일을하는 가장 좋은 방법을 찾아 내려고했습니다.팬더 데이터 프레임에 벡터화 된 기능을 적용 할 수 있습니까?

지금은 dataframe의 모든 행에서 함수를 호출하려고합니다. 이 함수에 세 개의 numpy 배열을 전달하면 매우 빠르지 만 dataframeapply을 사용하면 속도가 매우 느립니다.

내 생각에 numpy은 첫 번째 경우에는 벡터화 된 기능을 사용하고 두 번째 경우에는 그렇지 않습니다. 해당 최적화를 사용하려면 pandas을 얻을 수있는 방법이 있습니까? 기본적으로, 의사 코드에서 나는 for row in frame: func(row['a'], row['b'], row['c']) 같은 것을하고 있다고 생각하지만 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는 이미 배열 (및 시리즈)을 허용합니다. 왜 대신에 apply를 사용합니까? – ayhan

+2

''beta.cdf (df.a, df.b, df.c) '를 호출하지 않는 이유는 무엇입니까? – BrenBarn

답변

4

apply을 사용하려고하는지 명확하지 않습니다. beta.cdf(df.a, df.b, df.c)을 사용해도됩니다.

+0

다시 한번 감사드립니다. 'dataframe' 컬럼을 vectorized 함수로 전달할 수 있다는 것을 알지 못했습니다. –

+0

물론 가능합니다! 팬더 데이터 프레임의 각 열은 팬더 시리즈입니다. – Parfait

관련 문제