使用右连接合并两个DataFrame未得到预期输出
核心排查方向
确认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

