2015-08-03 45 views
3

我有一個熊貓數據框與約。 250,000行。我想創建一個新的領域如下:Python熊貓:平庸應用報表令人難以置信的慢

df['new_field'] = df.apply(lambda x: x.field2 if x.field1 > 0 else 0, axis =1) 

這個工作,但上面的一行大約需要15秒的跑!

優化,我是這樣:

@numba.jit(nopython=True) 
def mycalc(field1, field2, out): 
    for i in xrange(field1.size): 
     if field1[i] > 0: 
      out[i] = field2[i] 
     else: 
      out[i] = 0 

    return out 

df['new_field'] = mycalc(df.field1.as_matrix(), df.field2.as_matrix(), np.zeros(df.field1.size)) 

,現在需要0.25秒。

我的問題是:有沒有更好的方法來做到這一點?

numba解決方案的時機很好,但整個方法看起來很古怪:我本來希望計算一個平庸可以在一條線上有效地完成。另外,在nopython模式下,我需要初始化numba之外的輸出數組,並將它傳遞給numba,因爲我知道numba無法在nopython模式下創建新數組。

一些數據來自SQL,我使用熊貓的次數越多,看起來越多,我最好在SQL中儘可能多地做,因爲速度差異是瘋狂的。現在,當然我很欣賞SQL在處理GB數據時會更快,但是對於250k行的平凡計算需要15秒纔會過多。

謝謝!

回答

4

您可以使用np.where

df['new_field'] = np.where(df['field1'] > 0, df['field2'], 0) 

所以上面的測試,您的布爾條件,當True否則返回0

返回df['field2']或在大熊貓風格:

df['new_field'] = df['field2'].where(df['field1'] >0, 0) 
+0

謝謝!對於更復雜的情況,矢量化如果不是不可能的話更難,你會推薦numba還是別的? –

+0

也許,總是善於分析,看看有什麼值得做的 – EdChum

相關問題