在有条件地更新系列中的值时,我经常使用Pandas mask和where方法来获得更清晰的逻辑.但是,对于性能相对较高的代码,我注意到相对于性能的显着下降numpy.where.
虽然我很乐意接受特定情况,但我很想知道:
mask/ where方法是否提供任何其他功能?我理解这3个参数但很少使用它们.例如,我不知道参数引用了什么. inplaceerrorstry-castlevelmask/ where优于numpy.where?如果存在这样的例子,它可能会影响我选择适当方法的方式.作为参考,这里有一些关于Pandas 0.19.2/Python 3.6.0的基准测试:
np.random.seed(0)
n = 10000000
df = pd.DataFrame(np.random.random(n))
assert (df[0].mask(df[0] > 0.5, 1).values == np.where(df[0] > 0.5, 1, df[0])).all()
%timeit df[0].mask(df[0] > 0.5, 1) # 145 ms per loop
%timeit np.where(df[0] > 0.5, 1, df[0]) # 113 ms per loop
Run Code Online (Sandbox Code Playgroud)
对于非标量值,性能似乎进一步分化:
%timeit df[0].mask(df[0] > 0.5, df[0]*2) # 338 …Run Code Online (Sandbox Code Playgroud)