首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >2参数.loc更新矢量化的最快方法是什么?

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

Stack Overflow用户
提问于 2019-01-31 16:02:19
回答 4查看 351关注 0票数 1

假设我有以下数据:

代码语言:javascript
复制
import pandas as pd
df = pd.DataFrame({'n': [1, 2, 3], 'm': [4, 4, 7]})
df.loc[df['m']==4,'n']=1

在一个相对较小的数据集上运行这个.loc函数(大约50,000个int32样本)需要11 is。有什么办法能让我加快速度吗?我希望同样的操作可以降到10-100μ之间.

更新

我编辑了上面的例子,使其更简洁一些。

在测试了所建议的方法之后,最快的是:

df['n'].values[df['m'].values == 4] = 1

将其应用于大约50,000个样本数据集后,该解决方案的运行速度比原始代码快244倍。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2019-01-31 16:18:01

有很多种方法。您可能希望考虑修改基础NumPy数组。然而,这不是一种记录在案的或官方推荐的方法。

代码语言:javascript
复制
# 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
票数 1
EN

Stack Overflow用户

发布于 2019-01-31 16:07:04

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

代码语言:javascript
复制
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)

所以你可以这样做:

代码语言:javascript
复制
df.numbers = np.where(df.more_numbers == 4, 1, df.numbers)
票数 2
EN

Stack Overflow用户

发布于 2019-01-31 16:04:50

所以用values就行了

代码语言:javascript
复制
%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
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54464580

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档