python - 用python编写快速代码
问题描述
我有一个包含两个主要列的大型数据集,包括快递代码及其相关的交货日期和时间
CourierTrips.head()
Courier Code Delivery Date Time 0 1232011104 2019/04/15 18:38 1 1232011104 2019/04/15 12:00 2 1232011076 2019/04/15 14:00 3 1232011076 2019/04/15 12:10 4 1102095903 2019/04/15 18:01
我想确定每个工作日每个快递的最后交货时间。首先,我使用两个不同的代码将日期和时间列分成不同的列,其中一个代码比另一个代码快得多:
第一种方法(非常慢):
#Delivery Date
CourierTrips["Delivery_Date"]=""
for i in range(len(CourierTrips["Delivery_Date"])):
CourierTrips["Delivery_Date"][i]=CourierTrips['Delivery Date Time'][i][:10]
#Delivery Time
CourierTrips["Delivery_Time"]=""
for i in range(len(CourierTrips["Delivery_Time"])):
CourierTrips["Delivery_Time"][i]=CourierTrips['Delivery Date Time'][i][11::]
第二种方法(非常快):
#Delivery Date
CourierTrips["Delivery_Date"]=[u[:10] for u in CourierTrips['Delivery Date Time']]
#Delivery Time
CourierTrips["Delivery_Time"]=[u[11::] for u in CourierTrips['Delivery Date Time']]
上述两个代码在分离日期和时间值方面具有相同的结果,但第二种方法比第一种方法快得多。
然后,为了确定每个快递员在每个工作日的最后交货时间,我必须针对每个特定的快递员代码计算一天中“交货日期时间”列的最大值。因此,我可以编写下面的代码将结果保存在 End Time 列中。
CourierTrips["End_Time"]=""
for i in range(len(CourierTrips["End_Time"])):
CourierTrips["End_Time"][i]=max(CourierTrips[(CourierTrips['Courier Code']==CourierTrips['Courier Code'][i]) &
(CourierTrips["Delivery_Date"]==CourierTrips["Delivery_Date"][i])]['Delivery_Time'])
CourierTrips.head()
Courier Code Delivery Date Time Delivery_Date Delivery_Time End_Time 0 1232011104 2019/04/15 18:38 2019/04/15 18:38 21:10 1 1232011104 2019/04/15 12:00 2019/04/15 12:00 21:10 2 1232011076 2019/04/15 14:00 2019/04/15 14:00 21:05 3 1232011076 2019/04/15 12:10 2019/04/15 12:10 21:05 4 1102095903 2019/04/15 18:01 2019/04/15 18:01 19:45
上面代码的结果是真的,可惜代码的执行时间太多了。我的数据集包含超过 100 万条记录,上面的代码花费了很多时间来获取结果。正如我所解释的,我可以编写一个快速代码来添加日期和时间列,但不幸的是,我找不到一个好的解决方案来编写一个快速代码来计算 End_Time 列的值。我的问题是,是否可以编写花费较少时间的代码来显示 End_Time 列的结果?如果有人可以通过回答我的问题来帮助我,我将不胜感激。
解决方案
不要循环遍历pandas dataframe
行。正如您已经亲眼所见,它永远不是答案。您可以通过以下方式找到每个的最新时间Courier Code
:
last_times = CourierTrips[['Courier Code', 'Delivery_Time']].groupby('Courier Code').max().reset_index()
然后将结果合并到CourierTrips
with (而不是您编写的代码的整个最后一部分):
CourierTrips = CourierTrips.merge(last_times.rename({'Delivery_Time':'End_Time'}, axis=1), how='left')
推荐阅读
- opengl - 如何将现有的 OpenGL 纹理转换为金属纹理
- json - 如何在python中将数据框列表转换为json
- r - 如果存在“正确”值,则进行条件替换
- c++ - 当参数是类类型c ++时用函数更改数组
- batch-file - 使用批处理脚本替换所有
- excel - 需要帮助修复 Excel 中的 IF(AND 语句
- sql - 我得到了用户元键的值,例如 a:1:{s:8:"investor";b:1;}
- javascript - JavaScript - 从数组中取出对象并将其内容放在相同的高度
- javascript - React-Native AsyncStorage:TypeError:无法读取未定义的属性“setItem”
- php - Laravel array_merge():参数 #2 不是 ServiceProvider.php 中的数组