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

如何基于ID和Year将merge数据集的值填充到主数据集df1的ltl列

解决方案:基于ID和Year匹配替换df1的ltl列0值

核心思路

放弃inner merge(会丢失df1未匹配行),改用**左连接(left merge)**完整保留df1的原有结构,再通过条件判断精准替换0值。

步骤与代码

  1. 预处理df2,提取关键匹配列
    只保留用于匹配和替换的字段,避免合并冗余数据:

    # 提取df2中ID、Year和用于替换的os列
    df2_subset = df2[['ID', 'Year', 'os']]
    
  2. 统一匹配字段的数据类型
    避免因ID/Year类型不匹配导致的匹配失败:

    # 统一ID为字符串类型,Year为整数类型(可根据实际数据调整)
    df1['ID'] = df1['ID'].astype(str)
    df2_subset['ID'] = df2_subset['ID'].astype(str)
    df1['Year'] = df1['Year'].astype(int)
    df2_subset['Year'] = df2_subset['Year'].astype(int)
    
  3. 左连接合并数据集
    基于ID和Year做左连接,完整保留df1的所有行与原有顺序:

    df_merged = df1.merge(df2_subset, on=['ID', 'Year'], how='left')
    
  4. 高效替换ltl列的0值
    用numpy的where实现大数据量(40万行)下的高效替换:

    import numpy as np
    # 当ltl为0时用对应os值替换,非0值保留原ltl
    df_merged['ltl'] = np.where(df_merged['ltl'] == 0, df_merged['os'], df_merged['ltl'])
    

    若追求代码直观性,也可使用apply(大数据量下效率略低):

    df_merged['ltl'] = df_merged.apply(
        lambda row: row['os'] if row['ltl'] == 0 else row['ltl'],
        axis=1
    )
    
  5. 恢复df1原结构
    删除合并时新增的临时os列,得到最终结果:

    df_result = df_merged.drop(columns=['os'])
    

问题根源说明

之前用inner merge时,仅保留了df1和df2共有的ID+Year组合,会丢失df1中未在df2出现的行;且合并后索引重新排列,直接赋值会导致索引不匹配,出现部分行(比如2020年未匹配到的行)无法正确填充。左连接则完全保留df1的行顺序与结构,从根源避免了索引问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 21:45:38