Как объединить два кадра данных по времени начала и времени окончания в панд?

#python #pandas #dataframe

Вопрос:

Как вы можете объединить два кадра данных df1 с расширенным временем и df2 временем начала и окончания?

 df1 = pd.DataFrame({"time": ["10:34:10", "10:34:20", "10:34:30", "10:34:40", "10:34:50", "10:35:00", "10:35:10", "10:35:20"]})
 
 df2 = pd.DataFrame({"start_time": ["10:34:10", "10:34:40"], "end_time": ["10:34:20", "10:34:50"], "session_type": ["11v11", "zonal game"]})
 

Желаемый результат -:

 df3

time      start_time  end_time  session_type
10:34:10  10:34:10    10:34:20  "11v11"
10:34:20  10:34:10    10:34:20  "11v11"
10:34:30  NaN         NaN        NaN
10:34:40  10:34:40    10:34:50  "zonal_game"
10:34:50  10:34:40    10:34:50  "zonal_game"
10:35:00  NaN         NaN        NaN
10:35:10  NaN         NaN        NaN
10:35:20  NaN         NaN        NaN
 

Любая помощь будет очень признательна!

Ответ №1:

Воспользуйся pandas.merge_asof :

 df1['time'] = pd.to_datetime(df1['time'])
df2['start_time'] = pd.to_datetime(df2['start_time'])
pd.merge_asof(df1, df2, left_on='time', right_on='start_time')
 

выход:

                  time          start_time  end_time session_type
0 2021-08-21 10:34:10 2021-08-21 10:34:10  10:34:20        11v11
1 2021-08-21 10:34:20 2021-08-21 10:34:10  10:34:20        11v11
2 2021-08-21 10:34:30 2021-08-21 10:34:30  10:34:40   zonal game
3 2021-08-21 10:34:40 2021-08-21 10:34:30  10:34:40   zonal game
 

Теперь, с обновленным набором данных, вы можете использовать tolerance :

 df1 = pd.DataFrame({"time": ["10:34:10", "10:34:20", "10:34:30", "10:34:40", "10:34:50", "10:35:00", "10:35:10", "10:35:20"]})
df2 = pd.DataFrame({"start_time": ["10:34:10", "10:34:40"], "end_time": ["10:34:20", "10:34:50"], "session_type": ["11v11", "zonal game"]})
df1['time'] = pd.to_datetime(df1['time'])
df2['start_time'] = pd.to_datetime(df2['start_time'])
pd.merge_asof(df1, df2, left_on='time', right_on='start_time', tolerance=pd.Timedelta('10s'))
 

выход:

                  time          start_time  end_time session_type
0 2021-08-22 10:34:10 2021-08-22 10:34:10  10:34:20        11v11
1 2021-08-22 10:34:20 2021-08-22 10:34:10  10:34:20        11v11
2 2021-08-22 10:34:30                 NaT       NaN          NaN
3 2021-08-22 10:34:40 2021-08-22 10:34:40  10:34:50   zonal game
4 2021-08-22 10:34:50 2021-08-22 10:34:40  10:34:50   zonal game
5 2021-08-22 10:35:00                 NaT       NaN          NaN
6 2021-08-22 10:35:10                 NaT       NaN          NaN
7 2021-08-22 10:35:20                 NaT       NaN          NaN
 

Комментарии:

1. Спасибо, очень помогли! Если у меня df["time"] больше записей , чем df["start_time"] , можно ли остановиться df["end_time"] и заполнить промежуточные значения NaN . Я обновил вопрос, чтобы показать проблему.

2. Я думаю, вы можете повторно вставить выходной кадр данных с df1 [«время»], я не могу проверить прямо сейчас, дайте мне знать, если у вас не получится.

3. Я не могу полностью решить эту проблему, поскольку результирующий фрейм данных заполняет NaN значения и содержит те же индексы, что и df1.