#python #python-3.x #pandas #dataframe
#python #python-3.x #pandas #фрейм данных
Вопрос:
позиция =
id time x y z
T1 1000 100 100 120
T1 2000 50 50 120
T2 1200 100 200 120
событие =
id time event
T1 1500 stopped
T2 1200 travelling
желаемый результат =
id time event x y z
T1 1500 stopped 100 100 120
T2 1200 travelling 100 200 120
Я могу объединить столбцы id и time, если время совпадает, есть ли элегантное решение для получения самого последнего времени?
Комментарии:
1. Можете ли вы объяснить, почему значение [x, y, z] для
time=1500
равно[100,100,120]
? Как time = 1000 более поздний, чем 1500, а не 1200?2. @SerialLazer Поскольку id = T1, существует несколько машин, которые генерируют события и позиции
3. почему для T1 1500 вы выбираете T1 1000, а не T1 2000?
4. @SandervandenOord потому что 1000 было самым последним, что произошло
Ответ №1:
Вы можете попробовать использовать .merge_asof() для решения этой проблемы.
Для этого оба ваших df должны быть отсортированы по времени.
Пример кода:
import pandas as pd
from io import StringIO
position_text = """
id time x y z
T1 1000 100 100 120
T1 2000 50 50 120
T2 1200 100 200 120
"""
event_text = """
id time event
T1 1500 stopped
T2 1200 travelling
"""
df_position = pd.read_csv(
StringIO(position_text),
sep='s ', header=0,
).sort_values(by=['time', 'id'])
df_event = pd.read_csv(
StringIO(event_text),
sep='s ', header=0
).sort_values(by=['time', 'id'])
df_result = pd.merge_asof(
df_event, df_position,
on='time', by='id',
direction='backward',
)
df_result.sort_values(by='id')
Это приводит к:
id time event x y z
T1 1500 stopped 100 100 120
T2 1200 travelling 100 200 120
Комментарии:
1. Это отлично работает и чрезвычайно эффективно по сравнению с выполнением чего-то подобного в SQL, большое спасибо за это merge_asof — фантастический метод