繁体   English   中英

设置熊猫值的最快方法

[英]Fastest way to set a value in pandas

In [118]: %timeit df['A'].ix[df['Id']=='000f00003'] = 3
10 loops, best of 3: 54.9 ms per loop

In [119]: %timeit df.loc[df['Id']=='000f00003','A'] = 4
10 loops, best of 3: 55.4 ms per loop

In [126]: %timeit df.ix[df['Id']=='000f00003','A'] = 5
10 loops, best of 3: 55.8 ms per loop

我正在使用的操作会对此值进行约20k次设置。 我正在尝试找到一种比上述三个选项中的任何一个更好的方法。 给定设置所需的过滤条件,是否有比设置变量更快的方法?

我确实知道最快的方法是矢量化,但是我认为我不能矢量化。 基本上,我需要获取DataFrame的一部分(在指定的时间大约50微秒),找到符合我的条件的行(我正在过滤的3列),然后像上面那样用找到的数据更新行。

您似乎遇到了使用切片和条件设置值的速度较慢的问题。 我遇到了类似的问题,发现使用where()运算符可以快得多。

当然,您不会显示您的数据,因此这可能会适用,也可能不会适用,如果没有,我对此表示歉意,但是对于我正在处理的一个大型数据框,我看到了2400万倍的加速!

 %timeit a[np.isnan(a)]=df2 1 loops, best of 3: 1 s per loop def time1(): b = a.where(np.isfinite(a),df2) a=b %timeit time1 10000000 loops, best of 3: 41.5 ns per loop 

当我深入分析时,看起来差别是第一个循环在setitem和__check__setitem__copy中花了大量时间然后收集。 当我重构代码以使用第二种方法时,代码的整个部分是如此之快,几乎无法注册。

我认为这里重要的是,第二种方法尽管看起来有点愚蠢地将b分配给a,然后又分配回a,却将要设置的位置的标识与实际的设置操作区分开了。 这似乎是因为.where()返回与原始大小相同的整个子帧,因此可以一次将其全部设置为原始大小。 请注意,如果您使用inplace = True消除了分配给b的分配,然后又分配回a的收益,那么大部分收益就消失了!

我已经简化了显示过程,但是“ a”实际上是我的应用程序和测试中多轴切片的多索引切片,df2也是如此。

另外,请注意.where替换逻辑为假的位置,因此我将逻辑从np.isnan转换为np.isfinite,从一个逻辑转换为另一个逻辑

暂无
暂无

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

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