Я довольно новичок в 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
Векторизация будет специфичной для функции. Итак, пытаетесь ли вы процитировать только этот 'beta.cdf' или могли бы быть другие? – Divakar
Итак, beta.cdf уже принимает массивы (и серии), почему вы используете вместо этого применение? – ayhan
Почему бы просто не называть 'beta.cdf (df.a, df.b, df.c)'? – BrenBarn