通过从一系列日期中查找最近的日期来获得针对特定ID的单个评分

时间:2019-08-04 18:17:00

标签: python pandas dataframe pandas-groupby

数据框1具有两列(customer_id,日期和等级),数据框2具有(customer_id,start_date,instrument_id)。该函数需要运行,以使DF2中的instrument_id包含最接近start_date的日期的等级。

DF1:

customer_id   date    rating
84952608    31-Mar-20   4-
84952608    31-Dec-19   3-
84952608    30-Jun-19   4
84952608    31-Mar-19   5-

DF2:

Instrument_id   customer_id start_date
000LCLN190240003    84952608    31-Mar-2019

结果DF:

Instrument_id   customer_id rating
000LCLN190240003    84952608    5-

选择了5个,因为start_date最接近日期

我有一个工作样本,但是在这种情况下,计算时间很长。对于大约3k记录,大约需要40-50秒 DF2是曝光,DF1是文件

for w in range(len(exposure)): 
        max_preceeding_date = file.loc[(file['customer_id']==exposure.loc[w,'customer_id']) & (file['date']<=exposure.loc[w,'start_date']),['rating','date']].sort_values('date', ascending=False)
value = max_preceeding_date.iloc[0,0]

我还尝试使用df.merge首先合并两个数据帧,但是无法弄清楚如何使用groupby获得最终输出。

感谢您在帮助这一方面上所花费的时间和精力。

1 个答案:

答案 0 :(得分:0)

合并数据帧并比较 datetime 对象:

In [254]: res_df = df2.merge(df1, how='left', on='customer_id')                                                         

In [255]: res_df[['start_date', 'date']] = res_df[['start_date', 'date']].apply(lambda s: pd.to_datetime(s))            

In [256]: res_df[res_df['date'] <= res_df['start_date']].sort_values(['start_date', 'date'], ascending=[False, False]).d
     ...: rop(['start_date', 'date'], axis=1)                                                                           
Out[256]: 
      Instrument_id  customer_id rating
3  000LCLN190240003  84952608     5-