基于条件匹配将一个DataFrame的时间序列映射到另一个DataFrame
实现方案
核心思路是先把宽表格式的df2转换为和df1对齐的长表格式,统一日期格式后做关联匹配,再按规则替换字段即可,具体实现如下:
步骤1:预处理df2,转换为长表并统一日期格式
import pandas as pd # 1. 将df2从宽表转长表,把多列日期字段转为行存储 df2_long = df2.melt( id_vars=["Names", "Category"], # 固定保留的非日期字段 var_name="Date", # 原日期列名转换为Date字段取值 value_name="df2_Value" # 原日期列对应的数值存储为新字段 ) # 2. 统一两个表的日期格式为datetime类型,避免字符串格式不一致导致匹配失败 df1["Date"] = pd.to_datetime(df1["Date"]) # df2原始日期格式为月/日/年,指定格式完成转换 df2_long["Date"] = pd.to_datetime(df2_long["Date"], format="%m/%d/%Y")
步骤2:关联两个表并按规则替换字段
# 左连接:以df1为基础,按姓名+日期匹配df2的对应记录 merged = df1.merge( df2_long, left_on=["Name", "Date"], right_on=["Names", "Date"], how="left", suffixes=("_df1", "_df2") ) # 按规则替换字段:匹配到df2记录的用df2的值,否则保留原df1的值 merged["Category"] = merged["Category_df2"].fillna(merged["Category_df1"]) merged["Value"] = merged["df2_Value"].fillna(merged["Value_df1"]) # 清理多余字段,得到最终结果 result = merged[["Name", "Category", "Date", "Value"]]
注意事项
如果df2中存在同一个Names + Date的重复记录,关联前需要先对df2_long做去重处理,示例如下:
# 保留最后一条重复记录,可根据实际需求调整keep参数 df2_long = df2_long.drop_duplicates(subset=["Names", "Date"], keep="last")
内容的提问来源于stack exchange,提问作者bigmacattack
相关产品推荐
相关产品推荐

