You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于条件匹配将一个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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 22:36:04