Как присоединиться к двум файлам данных, для которых значения столбцов находятся в определенном диапазоне?

Учитывая два df_1 и df_2 , как их присоединить, чтобы столбец datetime df_1 между start и end в df_2 :

 print df_1 timestamp AB 0 2016-05-14 10:54:33 0.020228 0.026572 1 2016-05-14 10:54:34 0.057780 0.175499 2 2016-05-14 10:54:35 0.098808 0.620986 3 2016-05-14 10:54:36 0.158789 1.014819 4 2016-05-14 10:54:39 0.038129 2.384590 print df_2 start end event 0 2016-05-14 10:54:31 2016-05-14 10:54:33 E1 1 2016-05-14 10:54:34 2016-05-14 10:54:37 E2 2 2016-05-14 10:54:38 2016-05-14 10:54:42 E3 

Получите соответствующее event где df1.timestamp находится между df_2.start и df2.end

  timestamp AB event 0 2016-05-14 10:54:33 0.020228 0.026572 E1 1 2016-05-14 10:54:34 0.057780 0.175499 E2 2 2016-05-14 10:54:35 0.098808 0.620986 E2 3 2016-05-14 10:54:36 0.158789 1.014819 E2 4 2016-05-14 10:54:39 0.038129 2.384590 E3 

5 Solutions collect form web for “Как присоединиться к двум файлам данных, для которых значения столбцов находятся в определенном диапазоне?”

Одним простым решением является создание interval index от start and end closed = both используют get_loc для получения события ie (Надеемся, что все времена даты указаны в timestamps dtype)

 df_2.index = pd.IntervalIndex.from_arrays(df_2['start'],df_2['end'],closed='both') df_1['event'] = df_1['timestamp'].apply(lambda x : df_2.iloc[df_2.index.get_loc(x)]['event']) 

Вывод :

             событие временной отметки AB
 0 2016-05-14 10:54:33 0.020228 0.026572 E1
 1 2016-05-14 10:54:34 0.057780 0.175499 E2
 2 2016-05-14 10:54:35 0.098808 0,620986 E2
 3 2016-05-14 10:54:36 0.158789 1.014819 E2
 4 2016-05-14 10:54:39 ​​0.038129 2.384590 E3

Небольшое улучшение решения Dark:

 idx = pd.IntervalIndex.from_arrays(df_2['start'], df_2['end'], closed='both') event = df_2.loc[idx.get_indexer(df_1.timestamp), 'event'] event 0 E1 1 E2 1 E2 1 E2 2 E3 Name: event, dtype: object df_1['event'] = event.values df_1 timestamp AB event 0 2016-05-14 10:54:33 0.020228 0.026572 E1 1 2016-05-14 10:54:34 0.057780 0.175499 E2 2 2016-05-14 10:54:35 0.098808 0.620986 E2 3 2016-05-14 10:54:36 0.158789 1.014819 E2 4 2016-05-14 10:54:39 0.038129 2.384590 E3 

Ссылка: вопрос о IntervalIndex.get_indexer.

Опция 1

 idx = pd.IntervalIndex.from_arrays(df_2['start'], df_2['end'], closed='both') df_2.index=idx df_1['event']=df_2.loc[df_1.timestamp,'event'].values 

Вариант 2

 df_2['timestamp']=df_2['end'] pd.merge_asof(df_1,df_2[['timestamp','event']],on='timestamp',direction ='forward',allow_exact_matches =True) Out[405]: timestamp AB event 0 2016-05-14 10:54:33 0.020228 0.026572 E1 1 2016-05-14 10:54:34 0.057780 0.175499 E2 2 2016-05-14 10:54:35 0.098808 0.620986 E2 3 2016-05-14 10:54:36 0.158789 1.014819 E2 4 2016-05-14 10:54:39 0.038129 2.384590 E3 

Вы можете использовать модуль pandasql

 import pandasql as ps sqlcode = ''' select df_1.timestamp ,df_1.A ,df_1.B ,df_2.event from df_1 inner join df_2 on d1.timestamp between df_2.start and df2.end ''' newdf = ps.sqldf(sqlcode,locals()) 

В этом методе мы предполагаем, что используются объекты TimeStamp.

 df2 start end event 0 2016-05-14 10:54:31 2016-05-14 10:54:33 E1 1 2016-05-14 10:54:34 2016-05-14 10:54:37 E2 2 2016-05-14 10:54:38 2016-05-14 10:54:42 E3 event_num = len(df2.event) def get_event(t): event_idx = ((t >= df2.start) & (t < = df2.end)).dot(np.arange(event_num)) return df2.event[event_idx] df1["event"] = df1.timestamp.transform(get_event) 

Объяснение get_event

Для каждой метки времени в df1 , скажем, t0 = 2016-05-14 10:54:33 ,

(t0 >= df2.start) & (t0 < = df2.end) будет содержать 1 true. (См. Пример 1). Затем возьмите точечный продукт с np.arange(event_num) чтобы получить индекс события, которому принадлежит t0 .

Примеры:

Пример 1

  t0 >= df2.start t0 < = df2.end After & np.arange(3) 0 True True -> T 0 event_idx 1 False True -> F 1 -> 0 2 False True -> F 2 

Возьмем t2 = 2016-05-14 10:54:35 для другого примера

  t2 >= df2.start t2 < = df2.end After & np.arange(3) 0 True False -> F 0 event_idx 1 True True -> T 1 -> 1 2 False True -> F 2 

Мы, наконец, используем transform чтобы преобразовать каждую метку времени в событие.

Давайте будем гением компьютера.