如何保留两个DataFrame指定列取值相同的行并获取被删除行
按A列交集筛选DataFrame并获取删除行的实现方法
你目前写的df3、df4的筛选代码逻辑是正确的,获取deleted_df可以通过以下方法实现:
方法1:直接取反筛选后拼接
通过pandas布尔索引的取反符~筛选出两个表中A列不在对方表中的行,再纵向拼接即可:
import pandas as pd # 你已有的筛选逻辑 df3 = df1[df1['A'].isin(df2['A'])].reset_index(drop=True) df4 = df2[df2['A'].isin(df1['A'])].reset_index(drop=True) # 筛选两个表中被删除的行并拼接 df1_del = df1[~df1['A'].isin(df2['A'])] df2_del = df2[~df2['A'].isin(df1['A'])] deleted_df = pd.concat([df1_del, df2_del], ignore_index=True)
方法2:预计算交集提升效率
如果数据量较大,可提前计算A列的交集值集合,后续所有筛选都复用这个集合,减少重复计算:
import pandas as pd # 提前计算A列的共同取值集合 common_a_vals = set(df1['A']) & set(df2['A']) # 筛选保留行 df3 = df1[df1['A'].isin(common_a_vals)].reset_index(drop=True) df4 = df2[df2['A'].isin(common_a_vals)].reset_index(drop=True) # 拼接删除行 deleted_df = pd.concat( [df1[~df1['A'].isin(common_a_vals)], df2[~df2['A'].isin(common_a_vals)]], ignore_index=True )
补充说明
代码中reset_index(drop=True)用来重置筛选后的行索引,和你给出的预期输出格式一致,如果不需要可以去掉该参数。
你也可以通过删除已保留行的索引来获取被删除行,效果和上述取反筛选等价:
df1_del = df1.drop(df3.index) df2_del = df2.drop(df4.index) deleted_df = pd.concat([df1_del, df2_del], ignore_index=True)
内容的提问来源于stack exchange,提问作者Hamouza
相关产品推荐
相关产品推荐

