如何在Pandas DataFrame中筛选基于文本变量重复且目标标签不同的行
解决方法:筛选文本重复但目标标签不同的Pandas行
这问题我之前处理过类似的,其实分两步就能轻松搞定,我给你一步步拆解,还附了示例代码方便你理解:
步骤1:先提取所有文本重复的行
首先,我们需要把所有存在重复文本的行都捞出来——注意这里不能只标记后续重复的行,要保留所有重复出现的文本行,所以用duplicated(subset='text', keep=False),其中subset指定用来判断重复的列(你的文本列,这里假设叫text),keep=False会标记所有重复的行,不管是第一次还是后续出现的。
步骤2:筛选出同一文本下目标标签不同的记录
接下来,在这些重复行里,我们只需要保留那些同一个文本对应多个不同目标标签的组。用groupby('text').filter()就能实现,通过lambda函数判断每个组里的target列(你的目标标签列)的唯一值数量是否大于1,大于1就说明这个文本有不同的标签,需要保留。
完整示例代码
import pandas as pd # 先创建一个示例DataFrame(你可以替换成自己的数据集) data = { 'text': ['Hi, I need help', 'Hello world', 'Hi, I need help', 'Python tips', 'Hello world'], 'target': [1, 0, 0, 1, 0] } df = pd.DataFrame(data) # 第一步:获取所有文本重复的行 duplicated_rows = df[df.duplicated(subset='text', keep=False)] # 第二步:筛选出同一文本下目标标签不同的记录 result_df = duplicated_rows.groupby('text').filter(lambda x: x['target'].nunique() > 1) print(result_df)
示例输出
text target 0 Hi, I need help 1 2 Hi, I need help 0
可以看到,只有Hi, I need help这两行被保留了,因为它们文本重复但目标标签不同;而Hello world虽然文本重复,但标签都是0,所以被过滤掉了。
简化写法
如果你喜欢简洁的代码,可以把两步合并成一行:
result_df = df[df.duplicated(subset='text', keep=False)].groupby('text').filter(lambda x: x['target'].nunique() > 1)
注意事项
- 记得把代码里的
text和target替换成你自己DataFrame里对应的列名; - 如果你的文本列有大小写、空格等细微差异导致误判,可以先对文本列做清洗(比如转小写、去空格)再判断重复。
内容的提问来源于stack exchange,提问作者Kurtis Pykes




