如何在Pandas DataFrame中排查不符合ID序列规则的重复员工?
问题
现有如下包含重复人员(按FirstName和LastName判定)的Pandas DataFrame:
ID FirstName LastName Country 1 Paulo Cortez Brasil 2 Paulo Cortez Brasil 3 Paulo Cortez Espanha 1 Maria Lurdes Espanha 1 Maria Lurdes Espanha 1 John Page USA 2 Felipe Cardoso Brasil 2 John Page USA 3 Felipe Cardoso Espanha 2 Steve Xis UK 1 Peter Dave UK np.nan Peter Dave UK
规则要求:
- 若人员仅出现一次,
ID必须为1 - 若人员重复出现,
ID需从1开始依次递增
现需筛选出不符合该规则的人员记录(返回该人员的全部记录),预期输出如下:
ID FirstName LastName Country 1 Maria Lurdes Espanha 1 Maria Lurdes Espanha 2 Felipe Cardoso Brasil 3 Felipe Cardoso Espanha 2 Steve Xis UK 1 Peter Dave UK np.nan Peter Dave UK
请问实现该需求的最优方法是什么?
最优实现方法
用Pandas的分组与内置函数可以高效实现需求,步骤如下:
1. 生成符合规则的标准ID
按FirstName和LastName分组,给每组内的记录生成从1开始的递增序列——用groupby().cumcount() + 1即可,因为cumcount会给每组内的记录从0开始计数,加1后正好匹配规则里的递增要求。
2. 标记不符合规则的记录
分三种情况判定:
- 原
ID为np.nan的,直接判定为不符合 - 若该人员仅出现1次,原
ID不等于1的,判定为不符合 - 若该人员重复出现,原
ID和生成的标准ID不一致的,判定为不符合
3. 提取所有不符合规则的人员的全部记录
找出所有存在不符合记录的人员组,然后提取这些组的完整记录即可。
完整代码示例:
import pandas as pd import numpy as np # 构造示例DataFrame data = { 'ID': [1, 2, 3, 1, 1, 1, 2, 2, 3, 2, 1, np.nan], 'FirstName': ['Paulo', 'Paulo', 'Paulo', 'Maria', 'Maria', 'John', 'Felipe', 'John', 'Felipe', 'Steve', 'Peter', 'Peter'], 'LastName': ['Cortez', 'Cortez', 'Cortez', 'Lurdes', 'Lurdes', 'Page', 'Cardoso', 'Page', 'Cardoso', 'Xis', 'Dave', 'Dave'], 'Country': ['Brasil', 'Brasil', 'Espanha', 'Espanha', 'Espanha', 'USA', 'Brasil', 'USA', 'Espanha', 'UK', 'UK', 'UK'] } df = pd.DataFrame(data) # 生成标准ID df['correct_id'] = df.groupby(['FirstName', 'LastName']).cumcount() + 1 # 标记无效记录 df['is_invalid'] = np.where( df['ID'].isna(), True, np.where( df.groupby(['FirstName', 'LastName'])['ID'].transform('count') == 1, df['ID'] != 1, df['ID'] != df['correct_id'] ) ) # 提取所有存在无效记录的人员组 invalid_group_ids = df[df['is_invalid']].groupby(['FirstName', 'LastName']).ngroup().unique() result = df[df.groupby(['FirstName', 'LastName']).ngroup().isin(invalid_group_ids)] # 移除辅助列,输出结果 result = result.drop(['correct_id', 'is_invalid'], axis=1) print(result)
这个方法的优势:
- 全程用Pandas内置的分组、transform等函数,效率远高于循环处理,适合大数据量场景
- 逻辑覆盖所有规则情况,包括ID为空、单条/多条记录的人员
- 精准提取不符合规则人员的全部记录,完全匹配需求
内容的提问来源于stack exchange,提问作者Paulo Cortez
相关产品推荐
相关产品推荐

