您可以使用带有布尔掩码的.loc 代替带有索引的.drop() 并使用快速numpy 函数numpy.where() 来实现更高效/更好的性能,如下所示:
import numpy as np
df2 = df.loc[df['Percent'] <= 500]
df2['Percent'] = np.where(df2['Percent'] >= 101, 100, df2['Percent'])
性能对比:
第 1 部分:原始大小数据框
旧代码:
%%timeit
df.drop(df[df.Percent > 500].index, inplace = True)
# This sets the upper limit on all values at 100
df['Percent'] = df['Percent'].clip(upper = 100)
1.58 ms ± 56 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
新代码:
%%timeit
df2 = df.loc[df['Percent'] <= 500]
df2['Percent'] = np.where(df2['Percent'] >= 101, 100, df2['Percent'])
784 µs ± 8 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
基准测试结果:
新代码需要 784 µs,而旧代码需要 1.58 ms:
大约快 2 倍
第 2 部分:大型数据框
让我们使用原始大小 10000 倍的数据框:
df9 = pd.concat([df] * 10000, ignore_index=True)
旧代码:
%%timeit
df9.drop(df9[df9.Percent > 500].index, inplace = True)
# This sets the upper limit on all values at 100
df9['Percent'] = df9['Percent'].clip(upper = 100)
3.87 ms ± 175 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
新代码:
%%timeit
df2 = df9.loc[df9['Percent'] <= 500]
df2['Percent'] = np.where(df2['Percent'] >= 101, 100, df2['Percent'])
1.96 ms ± 70.5 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
基准测试结果:
新代码需要 1.96 毫秒,而旧代码需要 3.87 毫秒:
速度也快了大约 2 倍