我有两个数据框list1和list2,它们分别具有不同数量的带有随机索引的行。 list1有〜240,000行,而list2有〜390,000行。根据['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
121 10:59 cdd 3
3240 11:19 oty 4
393 13:54 zqb 8
44 14:13 omu 1
...
list2上的每一行都有一个['time']值。我希望list2中的每一行都具有不低于其自身的['time']值的list1中的最新['rates']值。在此之前,可以将相同的['rates']值填充到list2中(很抱歉,我知道这很令人困惑)。下面显示了所需结果的示例并进行了说明。
所需结果
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开始。 list2的第一行位于10:31,因此应使用9:31的['rates']值代替10:34的rate值,因为10:34晚于10:31。 list2中的下一行是10:59。 list1中最后一个不在10:59之后的行是10:34,因此将10:34中的值2.42填充。list2中的第三行与11:19相同。
如何在不使用for循环缓慢遍历每一行iterrows()的情况下完成此操作,并执行上述一系列操作(如果在给定每个数据帧中几十万行的情况下进行其他检查将需要永恒)?谢谢!
答案 0 :(得分:2)
使用merge_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
答案 1 :(得分:0)
我只是将['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']