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

Python Pandas:两个DataFrame间的数值映射最优实现方案

基于(id, time_by_hour)组合匹配填充DataFrame数值

需求说明

我有两个DataFrame:df1和df2,需要针对df1的每一行,在df2中匹配(id, time_by_hour)的组合,将df2中对应的数值填充到df1的value列位置,最终得到完整的df1_final。

当前df1的样例数据

id time_by_min               time_by_hour          value
0  a  2017-06-30 01:25:00.000  2017-06-30 02:00:00  NaN
1  a  2017-06-30 01:36:32.308  2017-06-30 02:00:00  NaN
2  a  2017-06-30 02:...

解决方案

这里推荐几种Pandas常用的实现方式,按需选择即可:

  • 基础merge合并法(最直观高效):
    直接以id和time_by_hour作为连接键,将df2的数值列合并到df1,再替换原value列:

    # 假设df2中存储目标数值的列名为target_value
    df1_final = df1.merge(df2[['id', 'time_by_hour', 'target_value']], 
                          on=['id', 'time_by_hour'], 
                          how='left')
    # 替换原value列并清理临时列
    df1_final['value'] = df1_final['target_value']
    df1_final = df1_final.drop(columns=['target_value'])
    
  • 简洁assign赋值法:
    无需额外处理列,直接通过assign完成赋值:

    df1_final = df1.assign(
        value=df1.merge(df2, on=['id', 'time_by_hour'], how='left')['target_value']
    )
    
  • 字典映射法:
    先把df2转换成以(id, time_by_hour)为键的字典,再用apply+map匹配赋值:

    value_map = df2.set_index(['id', 'time_by_hour'])['target_value'].to_dict()
    df1_final = df1.copy()
    df1_final['value'] = df1_final.apply(lambda row: value_map.get((row['id'], row['time_by_hour'])), axis=1)
    

注意事项

  • 务必确保df1和df2中的time_by_hour列数据类型完全一致(比如都是datetime类型,避免一个是字符串一个是datetime),否则会出现匹配失败的情况。
  • 如果df2中存在多组相同的(id, time_by_hour)组合,merge会生成重复行,此时需要先对df2做去重或聚合处理(比如取均值、最大值等)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 12:08:11