簡體   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