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

#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 — фантастический метод