- 1.
df['column1']=myFunction(df['column1'])
Здесь вы определяете функцию, которая будет применяться на pd.Series
. Вы позволяете пандам справляться с тем, как это произойдет.
- 2.
df['column1']=df['column1'].apply(lambda x:myFunction[x])
Здесь вы подаете функцию на каждом элементе.
В общем, вариант 1 будет быстрее, чем вариант 2. Это в значительной степени зависит от вашего фактического myFunction
, если этот вектор векторизован или элемент за элементом. Пример
Корпус:
Давайте создадим dataframe с 2 колонками и 100000 строк (достаточно большой, чтобы оценить разницу в скорости), и квадратные элементы column1
:
In [1]:
import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.rand(100000,2),
columns=['column1','column2'])
def myFunction(s):
return s**2
In [2]: %%timeit
...: myFunction(df.column1)
...:
1000 loops, best of 3: 1.68 ms per loop
In [3]: %%timeit
...: df.column1.apply(lambda x: x**2)
...:
10 loops, best of 3: 55.4 ms per loop
Так здесь вы видите, что более чем в 30 раз быстрее выполнять операцию на pd.Series
, а не по элементам. Это потому, что myFunction
векторизован.
Теперь давайте рассмотрим пример, где ваш myFunction
не векторизованную но поэлементно:
In [4]: def myFunction(s):
...: return s.apply(lambda x: x**2)
...:
In [4]: %%timeit
...: myFunction(df.column1)
...:
10 loops, best of 3: 53.9 ms per loop
В основном это то же самое, делая прямой apply