python – 使用.apply或传递一列数据帧有什么区别

我希望将一个简单的函数应用于Pandas Dataframe中的列.我以两种不同的方式完成了它:

> 1.df [‘column1’] = myFunction(df [‘column1’])
> 2.df [‘column1’] = df [‘column1’].apply(lambda x:myFunction [x])

我的数据集并不是那么大,以至于无法区分,但我猜它将与速度有关.

任何人都可以解释有什么区别,哪个是首选?

最佳答案 > 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

基本上它与直接申请相同

点赞