【发布时间】:2018-08-21 21:51:06
【问题描述】:
如何通过字典 d 替换 Pandas 系列中的值 s 已被多次询问和重新询问。
推荐的方法(1、2、3、4)是使用s.replace(d),或者偶尔使用s.map(d)(如果您的所有系列值都在字典键中找到)。
但是,使用 s.replace 的性能通常非常慢,通常比简单的列表理解慢 5-10 倍。
替代方案s.map(d) 性能良好,但仅在字典中找到所有键时才推荐使用。
为什么s.replace 这么慢,如何提高性能?
import pandas as pd, numpy as np
df = pd.DataFrame({'A': np.random.randint(0, 1000, 1000000)})
lst = df['A'].values.tolist()
##### TEST 1 #####
d = {i: i+1 for i in range(1000)}
%timeit df['A'].replace(d) # 1.98s
%timeit [d[i] for i in lst] # 134ms
##### TEST 2 #####
d = {i: i+1 for i in range(10)}
%timeit df['A'].replace(d) # 20.1ms
%timeit [d.get(i, i) for i in lst] # 243ms
注意:此问题未标记为重复,因为它正在寻找关于何时使用不同数据集的不同方法的具体建议。这在答案中是明确的,并且是其他问题中通常不涉及的一个方面。
【问题讨论】:
-
@JohnE,你说得对,我在大约 1w 之后才找到你的答案。希望我给出的解释可以帮助人们通过源代码注意到行为何时(如果和何时)发生变化。随意将其标记为 dup :)。
-
不用担心,没关系,这里有太多东西被标记为欺骗 IMO ;-)
标签: python python-3.x pandas performance dictionary