Как объединить два DataFrames с несколькими перекрывающимися временными метками, используя дополнительную общую переменную - PullRequest
0 голосов
/ 31 октября 2018

Этот вопрос основан на вопросе, заданном здесь: Как объединить два кадра данных, для которых значения столбцов находятся в определенном диапазоне? и на него ответил @coldspeed. Ниже приведена модификация DataFrame для моей проблемы:

print df_1

  timestamp              A          B       User
0 2016-05-14 10:00    0.020228   0.026572    1
1 2016-05-14 10:00    0.057780   0.175499    2
2 2016-05-14 10:00    0.098808   0.620986    3
3 2016-05-14 10:15    0.158789   1.014819    1
4 2016-05-14 10:15    0.038129   2.384590    2
5 2016-05-14 10:15    0.038129   2.384590    3

print df_2

  start                end                  event   User  
0 2016-05-14 10:00     2016-05-14 10:54:33  E1       1        
1 2016-05-14 10:00     2016-05-14 10:54:37  E2       2
2 2016-05-14 10:00     2016-05-14 10:54:42  E3       3

desired output:

  timestamp              A          B       User  event
0 2016-05-14 10:00    0.020228   0.026572    1     E1
1 2016-05-14 10:00    0.057780   0.175499    2     E2
2 2016-05-14 10:00    0.098808   0.620986    3     E3
3 2016-05-14 10:15    0.158789   1.014819    1     E1
4 2016-05-14 10:15    0.038129   2.384590    2     E2
5 2016-05-14 10:15    0.038129   2.384590    3     E3

Итак, я считаю, что могу использовать в качестве базы:

idx = pd.IntervalIndex.from_arrays(df_2['start'], df_2['end'], closed='both')
event = df_2.loc[idx.get_indexer(df_1.timestamp), 'event']
df_1['event'] = event.values

Но мне нужен способ ссылаться на идентификатор пользователя, чтобы не перепутать сеансы, которые перекрываются.

1 Ответ

0 голосов
/ 31 октября 2018

В этом случае вы можете использовать merge_asof

pd.merge_asof(df1,df2,left_on='timestamp',right_on='end',by='User',direction ='forward')
Out[148]: 
            timestamp         A  ...                   end  event
0 2016-05-14 10:00:00  0.020228  ...   2016-05-14 10:54:33     E1
1 2016-05-14 10:00:00  0.057780  ...   2016-05-14 10:54:37     E2
2 2016-05-14 10:00:00  0.098808  ...   2016-05-14 10:54:42     E3
3 2016-05-14 10:15:00  0.158789  ...   2016-05-14 10:54:33     E1
4 2016-05-14 10:15:00  0.038129  ...   2016-05-14 10:54:37     E2
5 2016-05-14 10:15:00  0.038129  ...   2016-05-14 10:54:42     E3
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...