You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何按一个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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 13:03:31