Python 使用.apply或传递数据帧列之间有什么区别

Python 使用.apply或传递数据帧列之间有什么区别,python,pandas,Python,Pandas,我希望对数据帧中的列应用一个简单的函数。我用了两种不同的方式: 1.df['column1']=myFunction(df['column1']) 2.df['column1']=df['column1'].apply(lambda x:myFunction[x]) 我的数据集并没有那么大,无法分辨出差异,但我猜这与速度有关 有人能解释一下区别是什么,哪一个是首选的吗? 1.df['column1']=myFunction(df['column1']) 这里您定义了一个应用于pd.Seri

我希望对数据帧中的列应用一个简单的函数。我用了两种不同的方式:

  • 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列和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
因此,在这里您可以看到,在
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