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

Python pandas实现ID体系不同的两个DataFrame跨表匹配

Pandas 温湿度时序数据对齐合并方案

步骤1:先建立ID映射关系

由于湿度传感器ID和温度站点ID编码体系不统一,首先整理明确的ID对应关系,给湿度表匹配上对应的温度站点ID:

# 按实际业务映射补全所有id_h与id_t的对应关系
id_mapping = {
    1: 5,
    2: 5,
    3: 7
}
# 为湿度表新增关联用的温度站点ID字段
df_h["id_t"] = df_h["id_h"].map(id_mapping)

步骤2:长表阶段完成时序对齐(核心,避免列错位)

先分别转宽表再合并会触发列错位问题,根源是单个表转宽表时会自动跳过缺失时刻的记录,导致同位置的列对应不上实际时刻。
正确逻辑是先在长表结构下完成关联匹配,再统一转宽表,天然支持缺失值场景:

# 重命名温度表字段,避免合并时字段冲突
df_t_processed = df_t.rename(columns={"VALUE": "temp_value"})

# 以湿度表为基准,按「温度站点ID+日期+上报时刻」三个维度关联匹配温度数据
# how="left" 会自动保留所有湿度记录,匹配不到的温度值自动填充NaN,不会错位
df_long_merged = df_h.merge(
    df_t_processed,
    on=["id_t", "date", "time_hour"],
    how="left"
)

步骤3:统一转换为目标宽表结构

对齐完成的长表直接做行转列,不会出现时刻不匹配的问题:

# 分别转换湿度、温度指标为宽表格式
humidity_part = df_long_merged.pivot(
    index=["id_h", "id_t", "date"],
    columns="time_hour",
    values="VALUE"
).add_prefix("humidity_").reset_index()

temp_part = df_long_merged.pivot(
    index=["id_h", "id_t", "date"],
    columns="time_hour",
    values="temp_value"
).add_prefix("temperature_").reset_index()

# 合并得到最终宽表,索引完全一致不会出现匹配错误
final_df = humidity_part.merge(
    temp_part,
    on=["id_h", "id_t", "date"],
    how="left"
)

如果需要沿用之前的序号式列名,直接在pivot后重命名即可,示例:

# 湿度列重命名为h_value_1、h_value_2...格式
h_cols = [c for c in humidity_part.columns if c.startswith("humidity_")]
humidity_part.columns = ["id_h", "id_t", "date"] + [f"h_value_{i+1}" for i in range(len(h_cols))]
# 温度列按相同规则重命名即可

方案优势

  • 所有时序匹配逻辑在长表阶段完成,彻底解决分别转宽表带来的列顺序错位、缺测对不齐问题
  • 左连接逻辑天然支持缺失值,某时刻无对应温度记录时自动填空,不会出现错误匹配
  • 原生支持1个温度站点对应多个湿度传感器的映射场景,无需额外去重处理

内容的提问来源于stack exchange,提问作者Sadcow

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 18:48:19