2016-12-13 71 views
4

我正在尋找一個簡單的函數應用於熊貓數據框中的一列。我在兩種不同的方式做到了:使用.apply或傳遞一列數據幀有什麼區別

  • 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,如果這是矢量化的還是逐個元素。


案例:

讓我們創建2列100,000行(足夠大的升值速度上的差異)一個數據幀和正方形中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 

所以在這裏,您看到它在pd.Series上執行操作的速度比按元素快30倍以上。這是因爲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

相關問題