如果applymap速度如此之慢,我们为什么要使用它?

2024-05-04 11:26:03 发布

您现在位置:Python中文网/ 问答频道 /正文

让我们比较一下在所有情况下都有效的方法

初始数据帧:

arr = np.random.randint(10, 50, size=(1000, 1000))
df = pd.DataFrame(arr)

适用于:

%%timeit
df.apply(lambda x: x**3)
329 ms ± 117 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

转换:

%%timeit
df.transform(lambda x: x**3)
352 ms ± 48 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

Applymap(非常糟糕):

%%timeit
df.applymap(lambda x: x**3)
1.07 s ± 59.3 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

Applymap是最不灵活和最慢的,那么它为什么会存在呢


Tags: oflambdadevloopdfruns情况mean
1条回答
网友
1楼 · 发布于 2024-05-04 11:26:03

这里有张便条transformapply按列处理数据帧,而df.applymap按元素处理数据帧。因此,对于其他问题applymap将是唯一基于熊猫的解决方案


实施

applymap实际上是apply(lambda x: x.map(func))

不完全是这样,因为pandas在模块中使用私有方法

来自applymapapplymap的计时结果相似:

>>> timeit(lambda: df.applymap(lambda x: x ** 2), number=10)
3.8224549000005936
>>> timeit(lambda: df.apply(lambda x: x.map(lambda y: y ** 2)), number=10)
4.243166700000074
>>> 

更快的解决方案:

但是,是的,在这个问题上,没有哪个论点是最快的:

>>> timeit(lambda: df ** 2, number=10)
0.016250700000455254
>>> 

但对于需要应用元素的常规情况,np.vectorize也是一种解决方案:

df[:] = np.vectorize(lambda x: x ** 2)(df)

时间安排(无任务):

>>> timeit(lambda: np.vectorize(lambda x: x ** 2)(df), number=10)
2.313548300000548
>>> 

applymap有效,但applytransform无效的示例:

例如,将它们除以100,并将数字转换为unicode数字的字符:

>>> df.applymap(lambda x: chr(x // 100))
    0   1   2   3   4   5   6   7   8   9   10  11  12  13   ... 986 987 988 989 990 991 992 993 994 995 996 997 998 999
0     ـ   ⹓   禌   㪞   ག   Ǻ   䤵   ʏ   콜   ̓   鉨   ␓   ೵   ᓂ  ...   ̓   ૮   ␓   Ï   Ǻ   搀   䤵   ᮠ   Й   Й   ޘ   Ï   ૮   薌
1     ೵   ʏ   婞   Й   뺜   薌   ـ   ᾤ   ೵   ᾤ   ĝ   ೵   ⣵   ೵  ...   婞   ␓   关         ⣵   콜   ĝ   ૮   关      䤵   ᠂   ૮
2     婞   婞   ૮   䆜   ᾤ   뺜   Ǻ   㐳   ᇙ   Й   Ǻ   콜   ⹓   ĝ  ...   ೵   Ï   禌   ૮   ૮   ག   ƀ   콜   ⹓   湡   ޘ   Ï   㪞   禌
3     ⣵   ᇙ   ␓   뺜   Ï         Ï   鉨   㪞   콜   ꀮ   뺜   禌  ...   薌   ⣵   湡   婞   婞   㐳   Ǻ   ᇙ   d   d   ـ   ೵   鉨   ᓂ
4     ೵   द   ޘ   ⹓   ƀ   薌   ԗ   ག   ԗ   ૮   ԗ   ᮠ   ꀮ   䆜  ...   ޘ   ᇙ   㐳   ʏ   ᮠ   ⹓   搀   d   婞   ԗ   禌   Й   콜   ʏ
..   ..  ..  ..  ..  ..  ..  ..  ..  ..  ..  ..  ..  ..  ..  ...  ..  ..  ..  ..  ..  ..  ..  ..  ..  ..  ..  ..  ..  ..
995   Ǻ   ĝ   껦   禌   ĝ   搀   ƀ   薌   ᇙ   ĝ   뺜   ᾤ   ૮   ᇙ  ...   䤵   द   ૮   द   ꀮ   婞   䤵   ĝ   ␓   薌   ␓   ƀ   ̓   鉨
996   婞   ૮   Й   薌   ـ   ག   湡   䤵   ␓   뺜   ␓   ޘ   婞   ꀮ  ...   뺜   ⣵   䤵      뺜   ೵   ೵      ⹓   ĝ   薌      ̓   d
997   䤵   Ï   ƀ   Й      ƀ   䤵   ƀ   ᓂ   ⣵      ᮠ   䤵   ૮  ...   䤵   Й   Ï   द   鉨   㪞   ⹓   ␓   关   Ǻ      ĝ   ᇙ   द
998   ʏ   ⹓   d   द   d   㪞      ꀮ   d   薌   薌   ᠂   ƀ   ̓  ...   ᮠ   ᓂ   ĝ   ག   䤵   㐳   ʏ   ⣵   㐳   ʏ   ᇙ   搀   ᓂ   ̓
999   ޘ      䤵   Ǻ   껦   ̓   ԗ   ĝ   ƀ   ꀮ   㐳   湡   搀   ⹓  ...   ޘ   搀   䤵   湡   ૮   鉨   ޘ   Ï   㐳   ƀ      禌   㪞   ـ

[1000 rows x 1000 columns]
>>> df.apply(lambda x: chr(x // 100))
TypeError: cannot convert the series to <class 'int'>
>>> 

np.vectorize在这里也适用:

>>> df[:] = np.vectorize(lambda x: chr(x // 100))(df)
>>> df
    0   1   2   3   4   5   6   7   8   9   10  11  12  13   ... 986 987 988 989 990 991 992 993 994 995 996 997 998 999
0     ـ   ⹓   禌   㪞   ག   Ǻ   䤵   ʏ   콜   ̓   鉨   ␓   ೵   ᓂ  ...   ̓   ૮   ␓   Ï   Ǻ   搀   䤵   ᮠ   Й   Й   ޘ   Ï   ૮   薌
1     ೵   ʏ   婞   Й   뺜   薌   ـ   ᾤ   ೵   ᾤ   ĝ   ೵   ⣵   ೵  ...   婞   ␓   关         ⣵   콜   ĝ   ૮   关      䤵   ᠂   ૮
2     婞   婞   ૮   䆜   ᾤ   뺜   Ǻ   㐳   ᇙ   Й   Ǻ   콜   ⹓   ĝ  ...   ೵   Ï   禌   ૮   ૮   ག   ƀ   콜   ⹓   湡   ޘ   Ï   㪞   禌
3     ⣵   ᇙ   ␓   뺜   Ï         Ï   鉨   㪞   콜   ꀮ   뺜   禌  ...   薌   ⣵   湡   婞   婞   㐳   Ǻ   ᇙ   d   d   ـ   ೵   鉨   ᓂ
4     ೵   द   ޘ   ⹓   ƀ   薌   ԗ   ག   ԗ   ૮   ԗ   ᮠ   ꀮ   䆜  ...   ޘ   ᇙ   㐳   ʏ   ᮠ   ⹓   搀   d   婞   ԗ   禌   Й   콜   ʏ
..   ..  ..  ..  ..  ..  ..  ..  ..  ..  ..  ..  ..  ..  ..  ...  ..  ..  ..  ..  ..  ..  ..  ..  ..  ..  ..  ..  ..  ..
995   Ǻ   ĝ   껦   禌   ĝ   搀   ƀ   薌   ᇙ   ĝ   뺜   ᾤ   ૮   ᇙ  ...   䤵   द   ૮   द   ꀮ   婞   䤵   ĝ   ␓   薌   ␓   ƀ   ̓   鉨
996   婞   ૮   Й   薌   ـ   ག   湡   䤵   ␓   뺜   ␓   ޘ   婞   ꀮ  ...   뺜   ⣵   䤵      뺜   ೵   ೵      ⹓   ĝ   薌      ̓   d
997   䤵   Ï   ƀ   Й      ƀ   䤵   ƀ   ᓂ   ⣵      ᮠ   䤵   ૮  ...   䤵   Й   Ï   द   鉨   㪞   ⹓   ␓   关   Ǻ      ĝ   ᇙ   द
998   ʏ   ⹓   d   द   d   㪞      ꀮ   d   薌   薌   ᠂   ƀ   ̓  ...   ᮠ   ᓂ   ĝ   ག   䤵   㐳   ʏ   ⣵   㐳   ʏ   ᇙ   搀   ᓂ   ̓
999   ޘ      䤵   Ǻ   껦   ̓   ԗ   ĝ   ƀ   ꀮ   㐳   湡   搀   ⹓  ...   ޘ   搀   䤵   湡   ૮   鉨   ޘ   Ï   㐳   ƀ      禌   㪞   ـ

[1000 rows x 1000 columns]
>>> 

相关问题 更多 >