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

Pandas:如何按组判断DataFrame当前行ID是否与前置行重复

实现方案

通过pandas的分组处理逻辑即可实现该需求,核心是先保证每个分组内按order字段升序排列,再逐行判断当前id是否在同组之前的行中出现过,以下提供两种可直接运行的实现方式:

方式1:逐行判断(逻辑直观,适合小数据量)

代码逻辑清晰易读,逐行维护已出现的id集合做匹配判断:

import pandas as pd

# 若已读取自有数据,可跳过下面构造示例DataFrame的步骤
df = pd.DataFrame({
    'group': ['g1','g1','g2','g2','g2','g2','g2','g3','g3'],
    'id': [27391, 29381, 27391, 48401, 27391, 27391, 48401, 27391, 48401],
    'order': [1, 2, 3, 1, 2, 3, 4, 1, 2]
})

# 先按分组、排序字段重排数据,避免原始行顺序错乱
df = df.sort_values(by=['group', 'order'], ignore_index=True)

def judge_duplicate(group_data):
    appeared_ids = set()
    same_col = []
    for _, row in group_data.iterrows():
        if row['order'] == 1:
            same_col.append(pd.NA)
            appeared_ids.add(row['id'])
        else:
            same_col.append(row['id'] in appeared_ids)
            appeared_ids.add(row['id'])
    group_data['same?'] = same_col
    return group_data

df = df.groupby('group', group_keys=False).apply(judge_duplicate)

方式2:向量化实现(性能更高,适合大数据量)

利用pandas内置的重复值判断方法,无需手写循环,运行速度远快于逐行遍历:

import pandas as pd

# 若已读取自有数据,可跳过下面构造示例DataFrame的步骤
df = pd.DataFrame({
    'group': ['g1','g1','g2','g2','g2','g2','g2','g3','g3'],
    'id': [27391, 29381, 27391, 48401, 27391, 27391, 48401, 27391, 48401],
    'order': [1, 2, 3, 1, 2, 3, 4, 1, 2]
})

df = df.sort_values(by=['group', 'order'], ignore_index=True)
# 标记组内非首次出现的id为True
df['same?'] = df.groupby('group')['id'].duplicated(keep='first')
# 将每个组order=1的首行值替换为NA
df.loc[df['order'] == 1, 'same?'] = pd.NA

注意事项

  • 执行判断前必须先按group+order字段排序,否则行顺序不符合规则会导致判断结果出错
  • 两种方法输出结果完全一致,和给出的预期输出匹配,可根据数据量大小选择合适的实现

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 01:01:28