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

使用右连接合并两个DataFrame未得到预期输出

右连接未保留df2中2021年数据的排查方案

核心排查方向

  • 确认df2子集是否包含2021年数据
    你代码中使用的是df2[['city','Year','Asset_Type','psqm_city','city_returns']]作为右表,先单独验证这个子集里有没有2021年的行:

    print(df2[['city','Year','Asset_Type','psqm_city','city_returns']].query("Year == 2021"))
    

    如果输出为空,说明问题出在子集筛选(比如df2本身的2021数据已被提前过滤,或者列名拼写错误),和merge操作无关。

  • 检查连接键的数据类型一致性
    city、Year、Asset_Type三个键在df1和df2中的数据类型必须完全匹配,否则会导致隐性匹配失败。比如df1的Year是整数类型,df2的Year是字符串类型(如'2021'),merge时会无法匹配,甚至可能导致右表的2021行被错误处理。验证代码:

    print("df1键类型:\n", df1[['city','Year','Asset_Type']].dtypes)
    print("df2键类型:\n", df2[['city','Year','Asset_Type']].dtypes)
    

    若类型不一致,统一转换后再执行merge,比如将字符串类型的Year转为整数:

    df2['Year'] = df2['Year'].astype(int)
    
  • 排查连接键的隐性取值差异
    肉眼不可见的取值差异(如city字段的前后空格、Asset_Type的大小写差异)会导致匹配失败,但右连接仍应保留右表的行(左表字段为NaN)。你可以通过以下代码检查取值差异:

    # 对比city的取值
    print("df1独有的city:\n", set(df1['city']) - set(df2['city']))
    print("df2独有的city:\n", set(df2['city']) - set(df1['city']))
    # 同理检查Asset_Type
    print("df1独有的Asset_Type:\n", set(df1['Asset_Type']) - set(df2['Asset_Type']))
    print("df2独有的Asset_Type:\n", set(df2['Asset_Type']) - set(df1['Asset_Type']))
    
  • 验证merge结果是否存在2021年数据
    有时你可能误以为结果中没有2021年数据,但实际是左表字段为NaN,右表字段正常。直接查询merge后的结果:

    print(Index_step1.query("Year == 2021"))
    

额外注意点

如果上述检查都正常,排查是否有后续代码隐性过滤了2021年数据,比如merge后执行了类似Index_step1 = Index_step1.dropna(subset=['df1的某个字段'])的操作,导致右表独有的2021行被删除。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 09:25:44