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
相关产品推荐
相关产品推荐

