Python Pandas。应用于矢量化表单的功能

时间:2016-09-23 12:10:23

标签: python pandas

我试图将以下.apply转换转换为运行速度更快的矢量化形式。我尝试了.where,我尝试过普通的布尔索引,但我的解决方案无效。请发送给我正确的方向

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 个答案:

答案 0 :(得分: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))

答案 1 :(得分:2)

您可以使用np.where在一行中执行此操作:

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,否则它只返回您的列