Python 用另一列的最新值填充dataframe列
我有两个数据帧list1和list2,每个数据帧都有不同数量的随机索引行。列表1约有240000行,而列表2约有390000行。它们根据['time']列从最早时间到最晚时间进行排序。它们大致如下所示: 列表1Python 用另一列的最新值填充dataframe列,python,pandas,dataframe,calculated-columns,Python,Pandas,Dataframe,Calculated Columns,我有两个数据帧list1和list2,每个数据帧都有不同数量的随机索引行。列表1约有240000行,而列表2约有390000行。它们根据['time']列从最早时间到最晚时间进行排序。它们大致如下所示: 列表1 time rates 299 09:31 1.30 1230 10:34 2.42 32 13:40 1.49 ... ... 列表2 time Symbol IV 78 10:31 aqb 7
time rates
299 09:31 1.30
1230 10:34 2.42
32 13:40 1.49
... ...
列表2
time Symbol IV
78 10:31 aqb 7
121 10:59 cdd 3
3240 11:19 oty 4
393 13:54 zqb 8
44 14:13 omu 1
...
列表2中的每一行都有一个['time']值。我希望列表2中的每一行都有列表1中最新的['rates']值,该值不晚于它自己的['time']值。在此之前,可以将相同的['rates']值填入列表2中(很抱歉,我知道这很混乱)。下面显示了所需结果的示例和说明
期望的结果
time Symbol IV rates
78 10:31 aqb 7 1.30
121 10:59 cdd 3 2.42
3240 11:19 oty 4 2.42
393 13:54 zqb 8 1.49
44 14:13 omu 1 1.49
列表1中的第一行是9:31,第二行是10:34。列表2中的第一行是10:31,因此应该用9:31的['rates']值来填充,而不是10:34的rates值,因为10:34比10:31晚。列表2中的下一行是10:59。列表1中不在10:59之后的最后一行是10:34,因此将填入10:34中的值2.42。列表2中第三行的11:19也是如此
如果不使用for循环在每一行中缓慢地执行ItErrors(),并执行上面的一系列if-else检查(鉴于每个数据帧中有几十万行,这将花费很长时间),我该如何实现这一点呢?谢谢 我只是将['time']上的两个数据帧与一个指示符合并,然后在['time']上对新数据帧进行排序:
list2 = list2.merge(list1,how = 'outer', on= ['time'], indicator = True)
list2 = list2.sort_values(['time'])
然后使用“left_only”指示符填充行,从而使用“right_only”指示符行中的最新值填充Nan['rates']值,方法是:
list2= list2.fillna(method = 'ffill')
然后使用以下命令从列表1中删除行:
list2= list2.loc[list2['_merge']!= 'right_only']
使用
merge\u asof
df1.time=pd.to_datetime(df1.time,format='%H:%M')
df2.time=pd.to_datetime(df2.time,format='%H:%M')
pd.merge_asof(df2.sort_values('time'),df1.sort_values('time'),on='time',direction = 'backward' )
Out[79]:
time Symbol IV rates
0 1900-01-01 10:31:00 aqb 7 1.30
1 1900-01-01 10:59:00 cdd 3 2.42
2 1900-01-01 11:19:00 oty 4 2.42
3 1900-01-01 13:54:00 zqb 8 1.49
4 1900-01-01 14:13:00 omu 1 1.49