gpt4 book ai didi

python - 如果applymap 这么慢,我们为什么要使用它?

转载 作者:行者123 更新时间:2023-12-04 13:24:12 28 4
gpt4 key购买 nike

让我们比较所有在所有情况下都有效的方法
初始数据帧:

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是最不灵活和最慢的,那么为什么它存在呢?

最佳答案

这里只是一个注释。 transformapply正在处理数据帧列,而 df.applymap按元素处理。因此对于其他问题applymap将是唯一基于 Pandas 的解决方案。

执行applymap实际上是 apply(lambda x: x.map(func)) .
不完全是,因为 Pandas 在模块中使用私有(private)方法。
计时结果来自 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不会:
Ex 用于将它们除以 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]
>>>

关于python - 如果applymap 这么慢,我们为什么要使用它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69604900/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com