为了账号安全,请及时绑定邮箱和手机立即绑定

向量化 2 参数 .loc 更新的最快方法是什么?

向量化 2 参数 .loc 更新的最快方法是什么?

小怪兽爱吃肉 2021-10-26 11:03:10
假设我有以下数据框:import pandas as pddf = pd.DataFrame({'n': [1, 2, 3], 'm': [4, 4, 7]})df.loc[df['m']==4,'n']=1在相对较小的数据集(约 50,000 个 int32 样本)上运行此 .loc 函数需要 11 毫秒。有什么办法可以加快速度吗?我希望将相同的操作降低到 10-100μs 之间。更新我已经编辑了上面的例子,使其更加简洁。在测试了建议的方法后,最快的是:df['n'].values[df['m'].values == 4] = 1将其应用于约 50,000 个样本数据集后,该解决方案的运行速度比原始代码快 244 倍。
查看完整描述

3 回答

?
大话西游666

TA贡献1817条经验 获得超14个赞

所以就这样做 values


%timeit df.values[df['more_numbers']==4,0]=1

10000 loops, best of 3: 127 µs per loop

%timeit df.loc[df['more_numbers']==4,'numbers']=1

1000 loops, best of 3: 692 µs per loop


查看完整回答
反对 回复 2021-10-26
?
Cats萌萌

TA贡献1805条经验 获得超9个赞

有很多方法。您可能希望考虑修改底层 NumPy 数组。但是,这不是记录在案或官方推荐的方法。


# Python 3.6.5, Pandas 0.19.2, NumPy 1.11.4

np.random.seed(0)

df = pd.DataFrame({'n': np.random.randint(0, 10, 10**5),

                   'm': np.random.randint(0, 10, 10**5)})


%timeit df.loc[df['m'] == 4, 'n'] = 1                              # 1.3 ms

%timeit df['n'].values[df['m'].values == 4] = 1                    # 436 µs

%timeit df['n'] = np.where(df['m'].values == 4, 1, df['n'])        # 751 µs

%timeit df.iloc[df['m'].values == 4, df.columns.get_loc('n')] = 1  # 880 µs

%timeit df.loc[df['m'].values == 4, 'n'] = 1                       # 1.12 ms

%timeit df['n'] = df['n'].mask(df['m'].values == 4, 1)             # 1.34 ms


查看完整回答
反对 回复 2021-10-26
  • 3 回答
  • 0 关注
  • 192 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信