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

如何从DataFrame中仅删除另一DataFrame中存在的行各一次

解决DataFrame按对应数量删除匹配行的问题

你的问题在于,pd.merge(how='outer', indicator=True)会移除所有在dataframe2中存在的行,而不是按dataframe2里的出现次数来删除对应数量的行。比如dataframe2里只有1条(2, 'b'),但原方法会把dataframe1里所有的(2, 'b')都删掉,而你需要只删掉1条,保留剩下的那条。

下面提供两种可行的解决方案:

方法一:给重复行添加组内序号,精确匹配删除

通过给每个(col1, col2)分组添加组内累计序号,让每一行有唯一的匹配标识,这样就能精准删除dataframe2中对应数量的行:

import pandas as pd

dataframe1 = pd.DataFrame({'col1': [1, 2, 3, 4, 2], 'col2': ['a', 'b', 'c', 'd', 'b']})
dataframe2 = pd.DataFrame({'col1': [2, 4], 'col2': ['b', 'd']})

# 为每个分组添加组内序号
df1 = dataframe1.assign(
    count=dataframe1.groupby(['col1', 'col2']).cumcount()
)
df2 = dataframe2.assign(
    count=dataframe2.groupby(['col1', 'col2']).cumcount()
)

# 左连接后筛选未匹配的行,再移除辅助列
merged = pd.merge(df1, df2, on=['col1', 'col2', 'count'], how='left', indicator=True)
result = merged[merged['_merge'] == 'left_only'][dataframe1.columns]

print(result)

运行输出:

col1 col2
0     1    a
3     3    c
4     2    b

方法二:基于出现次数筛选保留行

先统计dataframe2中每个(col1, col2)的出现次数,再在dataframe1中保留超过该次数的行:

import pandas as pd

dataframe1 = pd.DataFrame({'col1': [1, 2, 3, 4, 2], 'col2': ['a', 'b', 'c', 'd', 'b']})
dataframe2 = pd.DataFrame({'col1': [2, 4], 'col2': ['b', 'd']})

# 统计df2中每个组合的出现次数
df2_counts = dataframe2.groupby(['col1', 'col2']).size().reset_index(name='df2_count')

# 给df1添加组内累计计数,并合并次数数据
df1 = dataframe1.assign(
    count=dataframe1.groupby(['col1', 'col2']).cumcount()
).merge(df2_counts, on=['col1', 'col2'], how='left').fillna({'df2_count': 0})

# 保留count >= df2_count的行(即超过df2出现次数的部分)
result = df1[df1['count'] >= df1['df2_count']][dataframe1.columns]

print(result)

这个方法同样能得到你想要的结果。

内容的提问来源于stack exchange,提问作者Merora

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 18:23:16