2016-09-23 83 views
1

我試圖將以下.apply轉換轉換爲運行速度更快的向量化表單。我試過。在哪裏,並且我嘗試了正常的布爾索引,但是我的解決方案無法正常工作。請給我在正確的方向Python Pandas .Apply函數向量化表格

oneDayDelta = datetime.timedelta(days=1) 
def correct_gps_datetimestamp(row): 
    new_dts = row['GPS_DateTime'] 
    if row['Created'].hour == 0 and row['GPS_DateTime'].hour > 10: 
     new_dts = row['GPS_DateTime'] - oneDayDelta 
    return(new_dts) 

allData['GPS_DateTime'] = allData.apply(correct_gps_datetimestamp,axis=1) 

非工作的解決方案:

allData['GPS_DateTime'] = allData.where(allData['Created'].hour == 0 & allData['GPS_DateTime'].hour > 10,allData['GPS_DateTime'] - datetime.timedelta(days=1)) 

回答

2

你可以使用在單行中執行此操作:

allData['GPS_DateTime'] = np.where((allData['Created'].dt.hour == 0) & (allData['GPS_DateTime'].dt.hour > 10), allData['GPS_DateTime'] - oneDayDelta, allData['GPS_DateTime']) 

注意,日期時間有dt.hour訪問拿到小時爲int值,這可以讓你比較整個DF,請注意,我們使用&這裏,而不是作爲and我們比較陣列。此外,由於運算符優先級,我們必須在條件附近使用括號。

(allData['Created'].dt.hour == 0) & (allData['GPS_DateTime'].dt.hour > 10) 

那麼,這一條件得到滿足,它返回的日期時間列減去一個數據timedelta,否則它只是返回的列

2

我想你需要添加()只有條件:

(allData['Created'].hour == 0) & (allData['GPS_DateTime'].hour > 10) 

allData['GPS_DateTime'] = allData.where((allData['Created'].hour == 0) & 
             (allData['GPS_DateTime'].hour > 10), 
             allData['GPS_DateTime'] - datetime.timedelta(days=1))