如何s通过字典替换Pandas系列中的值d已被多次询问和重新询问.
推荐的方法(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 …Run Code Online (Sandbox Code Playgroud) 假设我有以下数据集
lst = ['u', 'v', 'w', 'x', 'y']
lst_rev = list(reversed(lst))
dct = dict(zip(lst, lst_rev))
df = pd.DataFrame({'A':['a', 'b', 'a', 'c', 'a'],
'B':lst},
dtype='category')
Run Code Online (Sandbox Code Playgroud)
现在我想要replacedf中的B列值dct
我知道我能做到
df.B.map(dct).fillna(df.B)
得到预期的输出,但当我测试时replace(根据我的想法更直接),我失败了
输出显示如下
df.B.replace(dct)
Out[132]:
0 u
1 v
2 w
3 v
4 u
Name: B, dtype: object
Run Code Online (Sandbox Code Playgroud)
哪个不同于
df.B.map(dct).fillna(df.B)
Out[133]:
0 y
1 x
2 w
3 v
4 u
Name: B, dtype: object
Run Code Online (Sandbox Code Playgroud)
我能想到这种情况发生的原因,但为什么呢?
0 u --> change to y then change to u
1 v …Run Code Online (Sandbox Code Playgroud)