猿问

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

假设我有以下数据框:


import pandas as pd

df = 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 倍。


小怪兽爱吃肉
浏览 193回答 3
3回答

大话西游666

所以就这样做 values%timeit df.values[df['more_numbers']==4,0]=110000 loops, best of 3: 127 µs per loop%timeit df.loc[df['more_numbers']==4,'numbers']=11000 loops, best of 3: 692 µs per loop

Cats萌萌

有很多方法。您可能希望考虑修改底层 NumPy 数组。但是,这不是记录在案或官方推荐的方法。# Python 3.6.5, Pandas 0.19.2, NumPy 1.11.4np.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
随时随地看视频慕课网APP

相关分类

Python
我要回答