2016-10-22 78 views
1

我是pandasnumpy的新手,我試圖找出做某些事情的最佳方法。我可以將矢量化函數應用於熊貓數據框嗎?

現在我正試圖調用dataframe的每一行上的函數。如果我將三個numpy陣列傳遞給此函數,它非常快,但在dataframe上使用apply的速度非常慢。

我的猜測是numpy在第一種情況下使用矢量化函數,而不是在第二種情況下。有沒有辦法讓pandas使用該優化?基本上,在僞代碼,我認爲apply正在做類似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'列傳遞給矢量化函數。 –

+0

當然可以!回想熊貓數據框中的每一列都是熊貓系列。 – Parfait

相關問題