如何按一个DataFrame的行匹配删除另一个DataFrame的对应行?
如何根据另一个DataFrame的行匹配删除目标DataFrame的对应行?
问题背景
现有两个DataFrame:
df1:
id type "a" "alpha" "a" "alpha" "a" "beta" "a" "gamma"
df2:
id type "a" "alpha" "a" "alpha" "a" "alpha" "a" "alpha" "a" "beta" "a" "beta"
需求:对于df1中的每一行,若其与df2中的行具有相同的id和type,则从df2中删除一行。最终期望得到:
id type "a" "alpha" "a" "alpha" "a" "beta"
解决方案
方法一:分组计数后重构结果
通过统计两组数据中id+type组合的出现次数,计算df2剩余的数量,再重新生成结果DataFrame。
import pandas as pd # 构造示例数据 df1 = pd.DataFrame({ 'id': ['a', 'a', 'a', 'a'], 'type': ['alpha', 'alpha', 'beta', 'gamma'] }) df2 = pd.DataFrame({ 'id': ['a', 'a', 'a', 'a', 'a', 'a'], 'type': ['alpha', 'alpha', 'alpha', 'alpha', 'beta', 'beta'] }) # 按id和type分组统计出现次数 count_df1 = df1.groupby(['id', 'type']).size().reset_index(name='cnt') count_df2 = df2.groupby(['id', 'type']).size().reset_index(name='cnt') # 合并计数结果,计算剩余数量 merged_counts = count_df2.merge(count_df1, on=['id', 'type'], how='left', suffixes=('_df2', '_df1')) merged_counts['remaining'] = merged_counts['cnt_df2'] - merged_counts['cnt_df1'].fillna(0) # 过滤掉剩余数量<=0的组合 merged_counts = merged_counts[merged_counts['remaining'] > 0] # 根据剩余数量重构结果 result = merged_counts.reindex( merged_counts.index.repeat(merged_counts['remaining']) ).drop(['cnt_df2', 'cnt_df1', 'remaining'], axis=1).reset_index(drop=True) print(result)
方法二:添加重复标记后匹配删除
给每个id+type组合的行添加序号,标记重复项,然后匹配df1和df2的对应行并删除。
import pandas as pd df1 = pd.DataFrame({ 'id': ['a', 'a', 'a', 'a'], 'type': ['alpha', 'alpha', 'beta', 'gamma'] }) df2 = pd.DataFrame({ 'id': ['a', 'a', 'a', 'a', 'a', 'a'], 'type': ['alpha', 'alpha', 'alpha', 'alpha', 'beta', 'beta'] }) # 给每个id+type组的行添加累计序号,区分重复行 df1['dup_num'] = df1.groupby(['id', 'type']).cumcount() df2['dup_num'] = df2.groupby(['id', 'type']).cumcount() # 找到df2中与df1完全匹配的行(包括重复序号) matched_rows = df2.merge(df1, on=['id', 'type', 'dup_num'], how='inner') # 从df2中删除匹配到的行,再移除临时序号列 result = df2.drop(matched_rows.index).drop('dup_num', axis=1).reset_index(drop=True) print(result)
方法说明
- 方法一适合数据量较大的场景,通过计数减少了逐行匹配的开销,效率更高。
- 方法二更直观,逐行标记匹配逻辑,适合需要清晰追踪删除过程的场景。
内容的提问来源于stack exchange,提问作者user12314164
相关产品推荐
相关产品推荐

