#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.