Ваша проблема выглядит как одна из самых распространенных проблем в работе базы данных. Я не совсем понимаю, что вы хотите получить, потому что вы не сформулировали задачу. Теперь к возможному решению - избегать петель на всех .
У вас очень длинный table
с колонками time, FlightID, Operator, Terminal, A_D
. Другие столбцы и даты не имеют значения, правильно ли я вас понимаю. Также start_time
и end_time
одинаковы в каждом ряду. Кстати, вы можете получить time
столбец с кодом table.loc[:, 'time'] = table.loc[:, 'START'].dt.time
.
table = table.drop_duplicates(subset=['time', 'FlightID', 'Operator', 'Terminal'])
. И ваша table
станет значительно короче.
Разделить table
на table_arr
и table_dep
в соответствии со значением A_D
: table_arr = table.loc[table.loc[:, 'A_D'] == 'A', ['FlightID', 'Operator', 'Terminal', 'time']]
, table_dep = table.loc[table.loc[:, 'A_D'] == 'D', ['FlightID', 'Operator', 'Terminal', 'time']]
Похоже, все, что вы пытались получить с помощью циклов, вы можете получить одной строкой: table_result = table_arr.merge(table_dep, how='right', on=['Operator', 'Terminal'], suffixes=('_arr', '_dep'))
. Это в основном та же операция, что и JOIN
в SQL.
В соответствии с моим пониманием вашей проблемы и наличием крошечного фрагмента данных, который вы предоставили, вы получите только желаемый результат (соответствие между FlightID_dep
и FlightID_arr
для всех значений FlightID_dep
) без какого-либо цикла намного быстрее. table_result
это:
FlightID_arr Operator Terminal time_arr FlightID_dep time_dep
0 DL401 DL 3 06:50:00 DL001 09:30:00
1 DL402 DL 3 07:45:00 DL001 09:30:00
2 NaN VS 3 NaN VS001 15:15:00
Конечно, в общем случае (с фактическими данными) вам потребуется еще один шаг - фильтр table_result
при условии time_arr < time_dep
или любом другом вашем условии. К сожалению, предоставленных вами данных недостаточно для полного решения вашей проблемы.
Полный код:
import io
import pandas as pd
data = '''
START,END,A_D,Operator,FlightID,Terminal,TROUND_ID,tot
2017-03-26 16:55:00,2017-10-28 16:55:00,A,QR,QR001,4,QR002,70
2017-03-26 09:30:00,2017-06-11 09:30:00,D,DL,DL001,3,,84
2017-03-27 09:30:00,2017-10-28 09:30:00,D,DL,DL001,3,,78
2017-10-08 15:15:00,2017-10-22 15:15:00,D,VS,VS001,3,,45
2017-03-26 06:50:00,2017-06-11 06:50:00,A,DL,DL401,3,,9
2017-03-27 06:50:00,2017-10-28 06:50:00,A,DL,DL401,3,,19
2017-03-29 06:50:00,2017-04-19 06:50:00,A,DL,DL401,3,,3
2017-05-03 06:50:00,2017-10-25 06:50:00,A,DL,DL401,3,,32
2017-06-25 06:50:00,2017-10-22 06:50:00,A,DL,DL401,3,,95
2017-03-26 07:45:00,2017-10-28 07:45:00,A,DL,DL402,3,,58
'''
table = pd.read_csv(io.StringIO(data), parse_dates=[0, 1])
table.loc[:, 'time'] = table.loc[:, 'START'].dt.time
table = table.drop_duplicates(subset=['time', 'FlightID', 'Operator', 'Terminal'])
table_arr = table.loc[table.loc[:, 'A_D'] == 'A', ['FlightID', 'Operator', 'Terminal', 'time']]
table_dep = table.loc[table.loc[:, 'A_D'] == 'D', ['FlightID', 'Operator', 'Terminal', 'time']]
table_result = table_arr.merge(
table_dep,
how='right',
on=['Operator', 'Terminal'],
suffixes=('_arr', '_dep'))
print(table_result)