您可以使用而不是循环df.update() https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.update.html像这样,获得 >20 倍的加速:
df = pd.DataFrame(np.random.choice([0, 0.05], size=(4000, 1000)))
%timeit df.update(np.random.choice([0, 0.05], size=df.shape), filter_func=lambda x: x==0.05)
#498 ms ± 19.4 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
df = pd.DataFrame(np.random.choice([0, 0.05], size=(4000, 1000)))
%timeit df.applymap(lambda x: np.random.choice([0, 0.05]) if x == 0.05 else 0)
#9.66 s ± 634 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
我注意到速度只会随着越来越大的数据帧而增加,但这里 applymap 已经花费了很长时间,因此我决定不再进一步增加数据帧大小。
怎么运行的
df = pd.DataFrame(np.random.choice([0, 0.05], size=(1000, 1000)))
print(df.tail(2))
df.update(np.random.choice([0, 0.05], size=df.shape), filter_func=lambda x: x==0.05)
print(df.tail(2))
# 0 1 2 3 4 5 ... 994 995 996 997 998 999
#998 0.00 0.05 0.05 0.0 0.05 0.05 ... 0.0 0.05 0.05 0.05 0.05 0.0
#999 0.05 0.00 0.05 0.0 0.05 0.05 ... 0.0 0.05 0.05 0.05 0.00 0.0
#
#[2 rows x 1000 columns]
# 0 1 2 3 4 5 ... 994 995 996 997 998 999
#998 0.00 0.05 0.00 0.0 0.05 0.05 ... 0.0 0.05 0.05 0.0 0.05 0.0
#999 0.05 0.00 0.05 0.0 0.05 0.00 ... 0.0 0.00 0.05 0.0 0.00 0.0
#
#[2 rows x 1000 columns]
With update
,您可以更改 DataFrame 中选定的值。选择值(默认np.nan
) use filter_func= lambda x: x==0.05
然后创建一个与原始 DataFrame 大小相同的 DataFrame,其中随机选择[0, 0.05]
。然后它从原始 DataFrame 中选择值0.05
并将其替换为随机值。