如何获取两个DataFrame的差异数据集?df2为df1子集时生成df3
刚好处理过类似的需求,我给你拆解成两种常见场景来讲,你可以根据自己的实际情况选:
场景1:保留df1全列,只取不在df2里的行
这是最常用的情况——你想保留原数据的所有字段,只剔除那些已经在df2里的记录。
情况1.1:按行索引匹配(df2的索引是df1的子集)
如果df2是直接从df1里按索引筛选出来的子集,用索引差集最快捷:
# 提取df1中不在df2里的索引 unique_indexes = df1.index.difference(df2.index) # 生成目标数据集df3 df3 = df1.loc[unique_indexes]
情况1.2:按整行内容匹配(索引不同但行内容是df1的子集)
如果df2的索引和df1不对应,但每行内容都是df1里有的,用merge方法最稳妥(尤其是有重复行的情况):
# 左连接df1和df2,标记行的来源 merged = df1.merge(df2, how='left', indicator=True) # 只保留仅在df1中出现的行,然后删除标记列 df3 = merged[merged['_merge'] == 'left_only'].drop('_merge', axis=1)
要是你的数据没有重复行,也可以用更简洁的isin写法:
# 生成布尔掩码,标记哪些行不在df2里 mask = ~df1.isin(df2.to_dict('list')).all(axis=1) df3 = df1[mask]
场景2:同时取df1独有的行和独有的列
如果你既要剔除df2里有的列,又要剔除df2里有的行,就需要分两步筛选:
# 第一步:提取df1中df2没有的列 unique_cols = df1.columns.difference(df2.columns) # 第二步:提取df1中df2没有的行(这里用索引匹配为例,也可以换成上面的内容匹配方法) unique_indexes = df1.index.difference(df2.index) # 第三步:组合筛选结果得到df3 df3 = df1.loc[unique_indexes, unique_cols]
小提醒
- 用
merge方法比isin更适合处理有重复行的数据集,不容易出错; - 确保df1和df2对应列的数据类型一致,不然整行匹配可能会判断失误。
内容的提问来源于stack exchange,提问作者userPyGeo
相关产品推荐
相关产品推荐

