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

如何恢复Pandas右连接丢失的行并保留正确数据?

解决方案

1. 确认Right Join的表顺序

Right Join的核心逻辑是保留merge第二个参数(右表)的所有行,如果你的目标是保留包含2021年行的第二个DataFrame所有条目,确保它是merge的第二个参数:

# 假设 pt 是第一个DataFrame,right_df 是包含2021年行的第二个DataFrame
merged_df = rdPy.merge(pt, right_df, how='right', on=['Category', 'AY'])

若之前搞反了左右表顺序,会直接导致右表的行被丢弃,这是最常见的问题。

2. 修正列赋值逻辑(无需更换连接方式)

你之前的赋值代码错误使用了isnull().any()——这个方法返回的是整个列的布尔值(是否存在空值),而非每行的空值判断。修正后可直接在Right Join结果上处理左表无匹配的行,且不影响其他正确匹配的条目:

# 筛选条件:Total不为0,且左表的RsvT列无匹配(为空)
mask = (merged_df['Total'] != 0) & merged_df['RsvT'].isnull()

# 对符合条件的行,将右表列值赋值到目标列
merged_df.loc[mask, 'LossP'] = merged_df.loc[mask, 'Loss']
merged_df.loc[mask, 'ALAEP'] = merged_df.loc[mask, 'ALAE']
merged_df.loc[mask, 'ULAEP'] = merged_df.loc[mask, 'ULAE']
merged_df.loc[mask, 'AAO-ULP'] = merged_df.loc[mask, 'AAO-UL']

3. 排查连接键匹配问题

如果Right Join后仍丢失行,检查连接键的一致性:

  • 数据类型统一:比如AY列一个是整数2021,一个是字符串"2021"会导致匹配失败,统一类型后再合并:
    pt['AY'] = pt['AY'].astype(str)
    right_df['AY'] = right_df['AY'].astype(str)
    
  • 消除格式差异:Category列可能存在前后空格或大小写差异,用字符串方法统一:
    pt['Category'] = pt['Category'].str.strip().str.lower()
    right_df['Category'] = right_df['Category'].str.strip().str.lower()
    
  • 检查重复键:右表若存在重复的[Category, AY]组合,merge后行数会膨胀但不会丢失行,可通过right_df.duplicated(subset=['Category', 'AY']).sum()统计重复数量。

4. 检查后续数据处理步骤

确认merge后是否有dropna、筛选等操作意外删除了左表无匹配的行(这类行的左表对应列会是NaN),比如:

# 错误示例:会删除所有RsvT为空的行
merged_df = merged_df.dropna(subset=['RsvT'])

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 10:32:26