Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/362.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 用另一列的最新值填充dataframe列_Python_Pandas_Dataframe_Calculated Columns - Fatal编程技术网

Python 用另一列的最新值填充dataframe列

Python 用另一列的最新值填充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

我有两个数据帧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
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