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

Два df1 и df2 (см. Ниже) предоставляют информацию об эксперименте, который измеряет параметр val в моменты времени t . Во время измерения flag устанавливается в True или False в соответствии с событием в некоторые (не все) моменты времени t . Между событиями флаг сохраняет свое значение.

Как соединить df1 и df2 с result который имеет столбец со значением flag для каждого измерения?

df1 = pd.DataFrame({'t':[0.5,1.3,2.1,3.3,4.0,5.6,6.1,7.9,8.3,9.0], 
   'val':['a0','b1','c2','d3','e4','j5','k6','l7','m8', 'n9']})
df2 = pd.DataFrame({'t':[0,2,3,5,7,8], 'flag':[False,True,False,True,False,True]})

# df1
   t val
0  0.5  a0
1  1.3  b1
2  2.1  c2
3  3.3  d3
4  4.0  e4
5  5.6  j5
6  6.1  k6
7  7.9  l7
8  8.3  m8
9  9.0  n9 

# df2
   t   flag
0  0  False
1  2   True
2  3  False
3  5   True
4  7  False
5  8   True

Нужно получить этот результат:

result = pd.DataFrame({'t':[0.5,1.3,2.1,3.3,4.0,5.6,6.1,7.9,8.3,9.0], 
                   'val':['a0','b1','c1','d3','e4','j5','k6','l7','m8','n9'],
                   'flag':[False,False,True,False,False,True,True,False,True,True]
                  })
# result:

    t   val flag
0   0.5 a0  False
1   1.3 b1  False
2   2.1 c1  True
3   3.3 d3  False
4   4.0 e4  False
5   5.6 j5  True
6   6.1 k6  True
7   7.9 l7  False
8   8.3 m8  True
9   9.0 n9  True

Всего 2 ответа


Используйте merge_asof :

print (pd.merge_asof(df1, df2.assign(t=df2["t"].astype(float)), on="t"))

     t val   flag
0  0.5  a0  False
1  1.3  b1  False
2  2.1  c2   True
3  3.3  d3  False
4  4.0  e4  False
5  5.6  j5   True
6  6.1  k6   True
7  7.9  l7  False
8  8.3  m8   True
9  9.0  n9   True

Метод от reindex

df1['New']=df2.set_index('t').reindex(df1.t,method='ffill').values
df1
     t val    New
0  0.5  a0  False
1  1.3  b1  False
2  2.1  c2   True
3  3.3  d3  False
4  4.0  e4  False
5  5.6  j5   True
6  6.1  k6   True
7  7.9  l7  False
8  8.3  m8   True
9  9.0  n9   True

Есть идеи?

10000