如何用Pandas找出2020数据集有但2021没有的指定行?
解决方法
你的问题出在最后一步的筛选逻辑错误,应该利用外连接后生成的_merge列来精准筛选仅存在于2020数据集的行,而不是用isin判断。
修正后的代码(基于merge方法)
value = 'EXAMPLE' filtered_df1 = df_2020[df_2020['column'].str.contains(value, na=False)] filtered_df2 = df_2021[df_2021['column'].str.contains(value, na=False)] # 执行外连接并添加来源标记列 merged_df = filtered_df1.merge(filtered_df2, on='column', how='outer', indicator=True) # 筛选仅存在于2020筛选数据中的行 missing_rows = merged_df[merged_df['_merge'] == 'left_only'] # 可选:删除不需要的_merge列 missing_rows = missing_rows.drop(columns='_merge')
更简洁的替代方法(无需merge)
直接在2020的筛选数据中,排除那些在2021筛选数据里存在的行:
value = 'EXAMPLE' filtered_df1 = df_2020[df_2020['column'].str.contains(value, na=False)] filtered_df2 = df_2021[df_2021['column'].str.contains(value, na=False)] missing_rows = filtered_df1[~filtered_df1['column'].isin(filtered_df2['column'])]
错误原因说明
你原来的代码中,merged_df是外连接后的结果,包含了两个数据集的所有column值。用~merged_df['column'].isin(filtered_df2['column'])筛选时,本质是找所有不在2021筛选数据里的column值,但外连接后的结果里这些值已经和2021的空值合并,且这种方式无法精准对应到原2020数据的完整行(如果原数据有其他列的话)。而利用_merge列的left_only标记,能直接定位到仅存在于左表(2020筛选数据)的完整行。
内容的提问来源于stack exchange,提问作者robot
相关产品推荐
相关产品推荐

