2017-04-25 52 views
0

我需要根據條件更新數據庫中的幾列。我正在使用numpy.where,並且寧願不改變它。Python用where條件更新多列。錯誤不能一起廣播

這是我能做什麼:

DB['Start'] = np.where(((DB['Start Date']<=time_delta) | (DB['Start Date'].isnull()) | (DB['Start Date'] == "")),DB['Start'],DB['Start Date']) 

DB['End'] = np.where(((DB['Start Date']<=time_delta) | (DB['Start Date'].isnull()) | (DB['Start Date'] == "")),DB['End'],DB['End Date']) 

等其他5列..但是這不會是計算效率。

將是不錯的有這樣的事情:

DB[['Start','End']] = np.where(((DB['Start Date']<=time_delta) | (DB['Start Date'].isnull()) | (DB['Start Date'] == "")),DB[['Start','End']],DB[['Start Date','End Date']]) 

但它沒有工作,提供了以下錯誤信息:「操作數不能與形狀(10)一起廣播(10,2) (10,2)」。

你有什麼建議如何有效地更新多列基於numpy.where條件?

+1

添加樣品數據? – Divakar

+0

不知道是否可以幫助,但這些是DB的列:TID,開始,結束,M,B,TaskID,開始日期,結束日期,機器,板。 對於這個數據我只是給這個測試放了一些隨機數據。不相關 – Filippo

回答

0

不知道這是可以接受你,因爲你提到的計算效率,這需要在同一臺計算機時間手工列出更新步驟。但萬一它有幫助...

columns_to_filter = ['Start', 'End'] 

for c in columns_to_filter: 
    DB[c] = np.where(((DB['Start Date']<=time_delta) | (DB['Start Date'].isnull()) | (DB['Start Date'] == "")),DB[c],DB[c + ' Date']) 
+0

感謝您的反饋,但我希望得到一個更優化的代碼。我實際上有10列根據相同的條件進行更新。必須有一個更有效的方式來處理它... – Filippo