合并DataFrame后如何找回丢失的5条观测值(仅需名称)
找回合并过程中丢失的DataFrame行
嘿,这个问题很常见——丢失的那5条行肯定是因为它们的两列组合键在DataFrame One里找不到匹配项,默认的内连接(inner join)会把这些不匹配的行直接丢掉。别担心,有两种简单的方法能快速找回它们的名称:
方法1:利用merge的标识参数(直观易操作)
用merge的indicator=True参数可以帮你标记每一行的匹配状态,再筛选出仅存在于DataFrame Two的行:
# 以DataFrame Two为左表做左连接,添加匹配状态列 merged_df = df_two.merge(df_one, on=['key_col1', 'key_col2'], how='left', indicator=True) # 筛选出仅在左表(df_two)存在的行 missing_rows = merged_df[merged_df['_merge'] == 'left_only'] # 提取你需要的名称列(把'name'换成你的实际列名) missing_names = missing_rows['name'].tolist()
这个方法会生成一个_merge列,值为left_only的就是你要找的、在合并中被丢弃的行。
方法2:直接检查键的存在性(高效省内存)
如果你的DataFrame数据量很大,不想做完整合并,可以直接对比两表的组合键集合:
# 把DataFrame One的两列键转换成集合,方便快速查找 one_key_pairs = set(zip(df_one['key_col1'], df_one['key_col2'])) # 筛选DataFrame Two中键组合不在集合里的行 missing_rows = df_two[~df_two.apply(lambda row: (row['key_col1'], row['key_col2']) in one_key_pairs, axis=1)] # 提取名称列 missing_names = missing_rows['name'].tolist()
额外提示
如果找出来的行里有键列是NaN的情况,那这就是原因——merge的时候NaN和任何值都无法匹配,会被自动排除。你可以单独检查一下这些行的键是否完整:
# 检查df_two中键列的缺失情况 df_two[df_two[['key_col1', 'key_col2']].isna().any(axis=1)]
内容的提问来源于stack exchange,提问作者Peter
相关产品推荐
相关产品推荐

