如何在无循环下基于另一DataFrame的日期与名称匹配取值?
解决方案
要实现这个需求,核心是通过精准的键匹配关联两个DataFrame,而非用isin这类批量筛选方式(后者无法把筛选结果精准对应回原DataFrame的每一行)。具体步骤如下:
- 先给
df_op生成目标日期列(当前日期延后2天):
df_op['target_date'] = df_op['Date'] + pd.DateOffset(days=2)
- 用
merge方法,以Name和目标日期为关联键,和df_quotes做左连接,获取对应Close值:
df_op = df_op.merge( df_quotes[['Name', 'Date', 'Close']], left_on=['Name', 'target_date'], right_on=['Name', 'Date'], how='left' )
- 最后重命名匹配到的
Close列为Next,并清理临时列:
df_op.rename(columns={'Close': 'Next'}, inplace=True) df_op.drop(columns=['target_date', 'Date_y'], inplace=True) # 若需保留原Date列名称,可补充:df_op.rename(columns={'Date_x': 'Date'}, inplace=True)
为什么之前的方法行不通?
你之前用的isin是批量筛选逻辑,它只能从df_quotes里挑出所有日期符合「df_op日期延后2天」且名称在df_op中的行,但这些行无法和df_op的每一行精准对应——比如多个行可能共享同一名称和目标日期,或是顺序打乱,导致无法正确填充到df_op的对应位置。而merge是基于指定键(Name+日期)做一对一/多对一的关联,能保证每一行的匹配准确。
内容的提问来源于stack exchange,提问作者chris
相关产品推荐
相关产品推荐

