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
相关产品推荐
相关产品推荐

