Написание быстрых кодов на python - PullRequest
1 голос
/ 10 октября 2019

У меня большой набор данных с двумя основными столбцами, включая код курьера и соответствующую дату и время доставки.

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']]

Оба вышеупомянутых кода имеют одинаковые результаты для разделения значений даты и времени, новторой метод работает намного быстрее первого.

Затем для определения последнего времени доставки каждого курьера в каждый рабочий день я должен вычислить максимальное значение столбца «Время доставки» за день. , для каждого конкретного кода курьера. Таким образом, я мог бы написать приведенный ниже код, чтобы сохранить результаты в столбце Время окончания.

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

Результаты приведенного выше кода верны, но, к сожалению, время выполнения кода слишком велико. Мой набор данных содержит более 1 миллиона записей, и приведенный выше код тратит МНОГО времени на результаты. Как я объяснил, я мог написать быстрый код для добавления столбцов даты и времени, но, к сожалению, я не смог найти хорошего решения для написания быстрого кода для вычисления значений столбца End_Time. Мой вопрос заключается в том, можно ли написать код, который тратит мало времени, чтобы показать результаты столбца End_Time? Буду признателен, если кто-нибудь сможет мне помочь, ответив на мой вопрос.

1 Ответ

2 голосов
/ 10 октября 2019

Не зацикливаться на pandas dataframe строках. Как вы уже убедились, это никогда не ответ. Вы можете найти самое позднее время для каждого Courier Code с помощью:

last_times = CourierTrips[['Courier Code', 'Delivery_Time']].groupby('Courier Code').max().reset_index()

и затем объединить результаты в CourierTrips с (вместо всей последней части написанного вами кода):

CourierTrips = CourierTrips.merge(last_times.rename({'Delivery_Time':'End_Time'}, axis=1), how='left')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...