我希望将一个简单的函数应用于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
基本上它与直接申请相同