2016-12-13 3 views
4

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

  • 1. df['column1']=myFunction(df['column1'])
  • 2. df['column1']=df['column1'].apply(lambda x:myFunction[x])

Мой набор данных не так велика, чтобы быть в состоянии сказать разницу, но я предполагаю, что это будет иметь со скоростью.

Может ли кто-нибудь объяснить, в чем разница, и что является предпочтительным?

ответ

2
  • 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

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