【发布时间】:2020-05-18 06:13:21
【问题描述】:
我注意到 pandas Series.map() 对于字典映射非常快
准备数据如下:
a=np.random.randint(0,1000,10**5)
s=pd.Series(a)
d=dict(zip(np.arange(1000),np.random.random(1000)))
时间
%timeit -n10 s.map(d)
%timeit -n10 np.vectorize(d.get)(a)
给予
1.42 ms ± 168 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)
20.6 ms ± 386 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)
第二种方法是我在 stackoverflow 上找到的执行 numpy dict 映射的典型建议。
numpy还有一个典型的解决方案如下
%%timeit -n10
b = np.copy(a)
for k, v in d.items():
b[a==k] = v
给了
43.9 ms ± 2.8 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
它甚至更慢,更糟糕的是,它给出了错误的结果。因为b 是int 类型,所以赋值b[a==k] = v 将返回b 将全为零!
所以我想知道 pandas Series.map() 的内部实现是什么?它是否在 numpy 中实现?具有相同性能的与 Series.map() 等效的 numpy 是什么?我试图深入研究 Series.map() 的源代码,但无法理解。
【问题讨论】:
标签: python pandas performance numpy