2016-10-22 2 views
1

Я довольно новичок в pandas и numpy, и я пытаюсь найти лучший способ сделать что-то.Могу ли я применить векторизованную функцию к кадру данных pandas?

Прямо сейчас я пытаюсь вызвать функцию на каждой строке dataframe. Если я передаю три массива numpy этой функции, это очень быстро, но с помощью apply на dataframe очень медленно.

Я предполагаю, что 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 уже принимает массивы (и серии), почему вы используете вместо этого применение? – ayhan

+2

Почему бы просто не называть 'beta.cdf (df.a, df.b, df.c)'? – BrenBarn

ответ

4

Непонятно, почему вы пытаетесь использовать apply. Вы можете просто сделать beta.cdf(df.a, df.b, df.c).

+0

Еще раз спасибо. Я не понимал, что могу просто перейти в столбцы «dataframe» в векторизованную функцию. –

+0

Уверен, что вы можете! Напомним, что каждый столбец в рамке данных pandas представляет собой панд-серию. – Parfait

Смежные вопросы