Pandas根据另一个表中的日期范围从一个表中获取值

时间:2018-02-20 04:30:51

标签: pandas

我需要根据另一个表中的数据范围,使用一个表中的生效日期提取值。一个范围内的最近生效日期应该是使用的新费率。

df1:
ID          EffectiveDate    Benefit   OldRate    NewRate
45jk9548      03/01/2017       Dental       0         15
45jk9548      01/01/2018       Dental      15         17
45jk9548      01/25/2018       Dental      17         50


df2:
ID        Benefit    FromDate     ToDate   
45jk9548   Dental   12/25/2017  01/02/2018       
45jk9548   Dental   01/08/2018  01/15/2018     
45jk9548   Dental   01/15/2018  01/22/2018
45jk9548   Dental   01/22/2018  01/29/2018
45jk9548   Dental   01/29/2018  02/05/2018 

理想情况下,从df1中提取数据或合并表将导致:

ID        Benefit    FromDate     ToDate    EffectiveDate    Rate  
45jk9548   Dental   12/25/2017  01/02/2018    01/01/2018       17   
45jk9548   Dental   01/08/2018  01/15/2018    01/01/2018       17    
45jk9548   Dental   01/15/2018  01/22/2018    01/01/2018       17
45jk9548   Dental   01/22/2018  01/29/2018    01/25/2018       50
45jk9548   Dental   01/22/2018  01/29/2018    01/25/2018       50

我已经尝试了一些嵌套for循环,但我一直得到最大/最后一个速率作为所有行的速率。感谢并非常感谢有关如何处理此问题的任何意见。

1 个答案:

答案 0 :(得分:0)

您可以先找到正确的EffectiveDate和Rate行,然后将它们与df2合并。

(
    df2.ToDate
    .apply(lambda x: df1.loc[df1.EffectiveDate.le(x)]
                     .sort_values('EffectiveDate')
                     [['EffectiveDate','NewRate']]
                     .iloc[-1]).apply(pd.Series)
                     .set_axis(['EffectiveDate', 'Rate'], axis=1, inplace=False)
    .pipe(lambda x: pd.concat([df2,x], axis=1))
)

Out[285]: 
         ID Benefit   FromDate     ToDate EffectiveDate  Rate
0  45jk9548  Dental 2017-12-25 2018-01-02    2018-01-01    17
1  45jk9548  Dental 2018-01-08 2018-01-15    2018-01-01    17
2  45jk9548  Dental 2018-01-15 2018-01-22    2018-01-01    17
3  45jk9548  Dental 2018-01-22 2018-01-29    2018-01-25    50
4  45jk9548  Dental 2018-01-29 2018-02-05    2018-01-25    50