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

如何基于条件移除Python DataFrame中的重复项?

针对每个用户移除连续重复的Math条目

嘿,我刚好碰到过类似的需求,用Pandas的分组+掩码操作就能轻松解决,咱们一步步来:

1. 先复现你的原始DataFrame

首先咱们把你给出的原始数据转换成可运行的Pandas代码,方便后续测试:

import pandas as pd

data = {
    'name': ['mason']*7 + ['paul']*5,
    'subject': ['first', 'math', 'math', 'first', 'chem', 'math', 'math', 'first', 'chem', 'first', 'math', 'math']
}
df = pd.DataFrame(data)

2. 核心解决代码

这段代码能精准实现你的需求——针对每个用户,只保留连续出现的Math中的第一个,移除后续连续重复的Math条目:

# 标记出同一用户下连续重复的Math行
mask = (df['subject'] == 'math') & (df.groupby('name')['subject'].shift(1) == 'math')

# 过滤掉标记的重复行,重置索引
result_df = df[~mask].reset_index(drop=True)

3. 代码逻辑拆解

咱们把这段代码的逻辑拆解开看:

  • df['subject'] == 'math':先筛选出所有科目为Math的行
  • df.groupby('name')['subject'].shift(1):按用户分组后,获取每个用户上一行的科目值,这样就能判断当前行是否和上一行是连续重复的Math
  • 两个条件结合后,mask会把同一用户下连续重复的Math行标记为True
  • 最后用~mask取反,保留非重复的行,再重置索引让结果和你给出的示例格式完全匹配

运行后打印result_df,就能得到你期望的输出啦!

额外补充:如果需求是每个用户只保留第一个Math(所有后续Math都移除)

如果你之后有调整需求的可能,比如每个用户只保留第一次出现的Math,其他所有Math都删掉,那可以用这段代码:

# 标记出每个用户除了第一个Math之外的所有Math行
mask = (df['subject'] == 'math') & (df.groupby('name')['subject'].cumcount().gt(0))
result_df = df[~mask].reset_index(drop=True)

不过这个结果和你给出的示例不符,所以还是前面的连续重复处理更贴合你的需求~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 13:07:35