繁体   English   中英

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

[英]What is the fastest way to vectorize a 2 parameter .loc update?

假设我有以下数据框:

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

您可以使用np.where获得更有效的解决方案:

df = pd.DataFrame({'numbers': np.random.choice(range(5), 100_000), 
                   'more_numbers': np.random.choice(range(5), 100_000)})

%timeit df.loc[df.more_numbers==4,'numbers']=1
7.09 ms ± 658 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

%timeit np.where(df.more_numbers == 4, 1, df.numbers)
547 µs ± 20.1 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

因此,您可以改为:

df.numbers = np.where(df.more_numbers == 4, 1, df.numbers)

所以就做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

你可以看看np.where()

df.numbers=np.where(df['more_numbers']==4,1,df.numbers)

有很多方法。 您可能希望考虑修改基础的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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM