Python矩阵迭代处理:匹配Ex-date对第二张DataFrame对应行扣减Div值
实现方案
我们可以用pandas内置的近似匹配方法merge_asof实现需求,效率远高于手动循环迭代,具体实现代码和说明如下:
前置假设
- 存储Ex-date和Div对应关系的DataFrame命名为
div_df,包含两列Ex-date、Div - 待处理的矩阵DataFrame命名为
data_df,首列为Ex-date,其余列为需要执行减法的数值列
完整实现代码
import pandas as pd # 步骤1:对两个DataFrame的Ex-date列做升序排序,merge_asof要求排序后才可执行近似匹配 div_df_sorted = div_df.sort_values("Ex-date", ignore_index=True) data_df_sorted = data_df.sort_values("Ex-date", ignore_index=True) # 步骤2:执行近似匹配,匹配最近的Ex-date对应的Div值 # direction参数可调整匹配规则:nearest=最近值,backward=找小于等于当前值的最近值,forward=找大于等于当前值的最近值 # 如需限制匹配误差阈值可加tolerance参数,例如tolerance=0.001表示仅允许Ex-date差值小于0.001的匹配 matched_df = pd.merge_asof( data_df_sorted, div_df_sorted, on="Ex-date", direction="nearest" ) # 步骤3:对除首列外的所有数值列减去对应Div值 value_cols = data_df_sorted.columns[1:] matched_df[value_cols] = matched_df[value_cols].sub(matched_df["Div"], axis=0) # 步骤4:删除辅助用的Div列,得到最终结果 final_df = matched_df.drop(columns=["Div"])
注意事项
如果匹配后出现Div为空的情况,说明对应行没有匹配到符合条件的Ex-date,该行数值不会被修改,符合常规业务逻辑。如果需要过滤无匹配的行,可在步骤2后加matched_df = matched_df.dropna(subset=["Div"])即可。
内容的提问来源于stack exchange,提问作者HugoLny
相关产品推荐
相关产品推荐

