Pandas性能比较:apply与map

5

我正在比较使用mapapply计算Dataframe列的简单乘法性能。

我预期apply版本会比map 快得多,因为我在使用向量化的numpy函数而不是逐个元素进行操作。

然而,事实并非如此,两个版本的性能相同:

apply版本:

import pandas as pd
import numpy as np

np.random.seed(42)

df1 = pd.DataFrame({
    'x': np.random.random(size=10000000)
})

df1['2x'] = df1['x'].apply(lambda arr: arr*2)
# CPU times: user 1.64 s, sys: 180 ms, total: 1.82 s
# Wall time: 1.82 s

地图版本:

import pandas as pd
import numpy as np

np.random.seed(42)

df2 = pd.DataFrame({
    'x': np.random.random(size=10000000)
})

df2['2x'] = df2['x'].map(lambda element: element *2)
# CPU times: user 1.65 s, sys: 180 ms, total: 1.83 s
# Wall time: 1.83 s

版本使用情况:Python 3.6.7,Pandas 0.24.2,Numpy 1.16.3。 为什么使用numpy向量化函数的apply版本没有比map版本快得多呢?
1个回答

9

apply() 只是一个伪装成 for 循环的东西,它没有向量化。你通过将 lambda 元素称为 arr 欺骗了自己,但实际上它是一个标量。

相反,保持简单,这样会快 100 倍:

df1['2x'] = df1['x'] * 2

我明白了,那么使用applymap没有优劣之分吗? - Felipe
4
@FelipeAlmeida,.apply.map都是Python中的for循环,它们只是方便的方法,不适用于性能。 - juanpa.arrivillaga
但是,如果我使用两个方括号而不是一个(返回数据框而不是系列),则对于列,apply确实比map快得多,如下所示:[notebook](https://github.com/queirozfcom/python-sandbox/blob/master/python3/notebooks/pandas-large-data/main.ipynb) - Felipe
2
@FelipeAlmeida:这是因为现在你正在每列应用一个函数调用,而不是每行一个。因此,[[]]应用与我的答案中的简单解决方案相同。 - John Zwinck

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接