如何恢复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
相关产品推荐
相关产品推荐

