【发布时间】:2018-02-16 12:55:22
【问题描述】:
我有以下数据框,我想将底部 1% 的值分配给新列。当我使用“.loc”通知进行此计算时,使用 .loc 分配大约需要 10 秒,而替代解决方案只需 2 秒。
df_temp = pd.DataFrame(np.random.randn(100000000,1),columns=list('A'))
%time df_temp["q"] = df_temp["A"].quantile(0.01)
%time df_temp.loc[:, "q1_loc"] = df_temp["A"].quantile(0.01)
为什么 .loc 解决方案较慢?我知道使用 .loc 解决方案更安全,但如果我想将数据分配给列中的所有索引,直接分配会出现什么问题?
【问题讨论】:
-
我没有得到这样的差异
In [355]: %time df_temp["q"] = df_temp["A"].quantile(0.01) Wall time: 1.67 s,In [356]: %time df_temp.loc[:, "q1_loc"] = df_temp["A"].quantile(0.01) Wall time: 1.92 s,In [357]: %time df.assign(q=df_temp["A"].quantile(0.01)) Wall time: 1.28 s,在pandas 0.22.0, python: 3.5.1., win 7中测试 -
使用
pandas 0.21.1,python 3.6.3,macOS 10.13.3,我得到了与 OP 相似的差异 -
我正在使用 python 2.7.13 和 pandas 0.22.0。 sacul 提供的解决方案大约需要 5 秒。奇怪的是,如果我在不重新加载数据帧的情况下重新运行代码,第一个和第二个解决方案的计算时间几乎相等。 (2.53 vs 2.58 秒),assign 方法是最慢的,4.9 秒