2014-05-22 63 views
1
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列),然後用上面找到的數據更新行。

+3

PLS顯示更多的數據。顯示一個框架的大小,顯示對樣本數據的操作。你如何設置值等 – Jeff

+0

我主要問的是,如果有任何方法,我已經錯過了。數據是相對不相關的,除非我們試圖解決這個問題是矢量化的或什麼的。我在.at和.iat文檔中看到了一些示例,但我無法複製它們。當通過查找具有列==的行來首次找到它時,是否有任何其他方法可用於在更大的df中設置單元格? – user1610719

+3

你越能表現出更好的反應,你會得到。 – Jeff

回答

0

它看起來像是遇到了一個問題,使用切片和條件設置值緩慢。我碰到類似的東西,發現使用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,從實際設置操作中分離出要設置的位置的標識。這似乎是因爲.where()返回與原始大小相同大小的整個子幀,因此可以一次設置爲原始大小。請注意,如果您通過使用inplace = True消除了對b的賦值,然後返回到a,則大部分增益消失!

我已經讓事情變得更簡單了,但是「a」實際上是一個在我的應用程序和測試中的多軸切片,與df2一樣。

另外,請注意。凡替換其中的邏輯是錯誤的,所以我倒邏輯從np.isnan到np.isfinite從一個走向另一個