我希望将一个简单的函数应用于 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
的函数。您让 pandas 处理这将如何发生。
- 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
关于python - 使用 .apply 或传递一列数据框有什么区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41131832/