用python编写快速代码

用python编写快速代码,python,pandas,numpy,dataframe,Python,Pandas,Numpy,Dataframe,我有一个包含两个主要栏的大型数据集,包括courier code 以及相关的交货日期和时间 CourierTrips.head() 我想确定每个快递员在每个工作日的最后交付时间。 首先,我将日期和时间列分为不同的列,使用两种不同的代码,其中一种代码比另一种代码快得多: 第一种方法(非常慢): #Delivery Date CourierTrips["Delivery_Date"]="" for i in range(len(CourierTrips["Delivery_Date"])):

我有一个包含两个主要栏的大型数据集,包括courier code 以及相关的交货日期和时间

CourierTrips.head()
我想确定每个快递员在每个工作日的最后交付时间。 首先,我将日期和时间列分为不同的列,使用两种不同的代码,其中一种代码比另一种代码快得多:

第一种方法(非常慢):

#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']]
第二种方法(非常快):

#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']]
上述两种代码用于分离日期和时间值的结果相同,但第二种方法比第一种方法快得多

然后,为了确定每个快递员在每个工作日的最后交付时间,我必须为每个特定快递代码计算一天中“交付日期时间”列的最大值。因此,我可以编写下面的代码,将结果保存在“结束时间”列中

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()
上述代码的结果是正确的,但不幸的是,代码的执行时间太长。我的数据集包含100多万条记录,上面的代码花费了很多时间来获取结果。 正如我所解释的,我可以编写一个快速代码来添加日期和时间列,但不幸的是,我找不到一个好的解决方案来编写一个快速代码来计算结束时间列的值。 我的问题是,是否可以编写一个花费较少时间来显示End_time列结果的代码?
如果有人能帮我回答我的问题,我将不胜感激。

不要在
pandas dataframe
行上循环。正如你自己已经看到的,这永远不是答案。您可以通过以下方式查找每个
快递代码的最新时间:

last_times = CourierTrips[['Courier Code', 'Delivery_Time']].groupby('Courier Code').max().reset_index()
然后将结果合并到
CourierTrips
中(而不是您编写的整个代码的最后部分):


在X中分割数据(例如X=4)。X将是线程数,在每个工作线程中使用拆分的数据执行相同的工作。因此,作业将同时执行4次,而使用amount数据250K1M@Wonka糟糕的解决方案。不需要在
数据帧
行上循环。+1表示“不在df上循环”。使用pandas的内置功能,如@Aryerez所示。顺便说一句,在第一个循环版本中,您在每次迭代中都会写入
CourierTrips[“Delivery\u Date”]
。在第二个版本中,使用列表理解,您只访问一次
CourierTrips[“Delivery_Date”]
,将整个列表放在那里。这就是为什么它很可能更快。
CourierTrips = CourierTrips.merge(last_times.rename({'Delivery_Time':'End_Time'}, axis=1), how='left')