【问题标题】:Filling dataframe column with the latest values of another column用另一列的最新值填充数据框列
【发布时间】:2019-01-21 15:23:15
【问题描述】:

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

list2

     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 中的每一行都具有来自 list1 的最新 ['rates'] 值,该值不晚于其自己的 ['time'] 值。在那之前,可以将相同的 ['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

list1 的第一行是从 9:31 开始的,第二行是从 10:34 开始的。 list2 中的第一行位于 10:31,因此应填充 9:31 的 ['rates'] 值,而不是 10:34 的 rates 值,因为 10:34 晚于 10:31。 list2 中的下一行是 10:59。 list1 中不是在 10:59 之后的最后一行是 10:34,所以填写 10:34 的值 2.42。list2 中的第三行与 11:19 相同。

如果不使用 for 循环来缓慢地遍历每一行并执行上面的一堆 if else 检查,如果每个数据帧中只有几十万行,我该如何实现这一点?谢谢!

【问题讨论】:

    标签: python pandas dataframe calculated-columns


    【解决方案1】:

    我只是将 ['time'] 上的两个数据帧与一个指标合并,然后对 ['time'] 上的新数据帧进行排序:

    list2 = list2.merge(list1,how = 'outer', on= ['time'], indicator = True)
    list2 = list2.sort_values(['time'])
    

    然后使用 'left_only' 指示符填充行,这些行因此具有 Nan ['rates'] 值和来自具有 'right_only' 指示符的行的最新值,方法是:

    list2= list2.fillna(method = 'ffill')
    

    然后从 list1 中删除行:

    list2= list2.loc[list2['_merge']!= 'right_only']
    

    【讨论】:

      【解决方案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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-05-14
        • 2020-11-26
        • 2018-12-08
        • 2019-12-09
        • 2017-02-10
        • 2021-03-16
        相关资源
        最近更新 更多