数据框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获得最终输出。
感谢您在帮助这一方面上所花费的时间和精力。
答案 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-