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

#pandas #csv

#pandas #csv

Вопрос:

Я хочу вставить фрейм данных в другой фрейм данных с ключом времени, идентификатор которого, по-видимому, следует за временем. Как это сделать?

мои данные выглядят так:

 df1
ID  Time
ID1 10:40
ID1 11:00
ID2 11:10
ID2 11:30

df2
Time    X   Y
10:40   45  50
10:50   55  55
11:00   65  60
11:10   75  65
11:20   85  70
11:30   95  75
  

мой ожидаемый результат выглядит примерно так:

 ID  Time    X   Y
ID1 10:40   45  50
ID1 10:50   55  55
ID1 11:00   65  60
ID2 11:10   75  65
ID2 11:20   85  70
ID2 11:30   95  75
  

спасибо за вашу помощь

Ответ №1:

Используйте merge_asof со столбцами datetimes, последнее использование Series.dt.strftime для преобразования в HH:MM строки:

 df1['Time'] = pd.to_datetime(df1['Time'])
df2['Time'] = pd.to_datetime(df2['Time'])

df = pd.merge_asof(df2, df1, on='Time').assign(Time = lambda x: x['Time'].dt.strftime('%H:%M'))
print (df)
    Time   X   Y   ID
0  10:40  45  50  ID1
1  10:50  55  55  ID1
2  11:00  65  60  ID1
3  11:10  75  65  ID2
4  11:20  85  70  ID2
5  11:30  95  75  ID2
  

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

1. возможно ли это без преобразования в datetime?

2. Должно быть другое решение df2.merge(df1, how='outer').ffill() , но немного опасное — необходимо всегда сопоставлять первые строки, иначе неверно назначенные идентификаторы. Это зависит от данных.

3. спасибо за ваш совет. Я получил KeyError: 'Time' . как насчет этого?

4. @Arief Что такое print (df1.columns.tolist()) и print (df2.columns.tolist()) ?

5. @Arief — Если проверка вторая, то это траление пространства 'Time ' , поэтому используйте df2.columns = df2.columns.str.strip()