组合唯一的ID并创建一个额外的ID列



我有一个包含员工姓名的数据框架,每行代表他们的合同信息,他们合同的员工类型,合同ID以及哪个合同是主要合同(如果一个人有1份合同,它总是标记为"是",如果他们有1份以上的合同,1份标记为"Yes",其他合同标记为"No"(,如本例所示:

Name    Employee Type   ID  Primary Contract?
Paulo   Employee        10  Yes
Paulo   Contractor      10  No
Paulo   Contractor      10  No
Paulo   Employee        10  No
Paulo   Employee        10  No
Pedro   Employee        11  No
Pedro   Contractor      11  Yes
Jonas   Contractor      16  Yes
Jonas   Contractor      16  No
Felipe  Non Worker      15  Yes
Maria   Employee        13  No
Maria   Contractor      13  Yes
Maria   Employee        13  No

我需要创建一个名为";分配ID";遵循以下逻辑:

  • 用";是";在";主合同"将始终是员工类型的第一个数字字母+身份证号码

  • 其他行的分配ID将遵循相同的逻辑,但是,如果该ID已经存在,则添加"0"-2〃;紧接着(不是从"-1"开始,而是从"-2"开始(,以及副本的后续增加(-3、-4等((对于"主合同?"中带有"否"的没有具体顺序(。

  • 如果ID的第一个数字字母发生变化,则不视为相同的ID。

预期输出为:

Name    Employee Type   ID  Primary Contract?   Assignment ID
Paulo   Employee        10  Yes                 E10
Paulo   Contractor      10  No                  C10
Paulo   Contractor      10  No                  C10-2
Paulo   Employee        10  No                  E10-2
Paulo   Employee        10  No                  E10-3
Pedro   Employee        11  No                  E11
Pedro   Contractor      11  Yes                 C11
Jonas   Contractor      16  Yes                 C16
Jonas   Contractor      16  No                  C16-2
Felipe  Non Worker      15  Yes                 N15
Maria   Employee        13  No                  E13
Maria   Contractor      13  Yes                 C13
Maria   Employee        13  No                  E13-2

非常感谢您的支持!

让我们尝试使用groupby().cumcount()来枚举每个ID/Type 中的行

df['Assignment_ID'] = df['Employee Type'].str[0].add(df['ID'].astype(str))
# also can groupby(['Employee Type', 'ID'])
counts df.groupby('Assignment_ID').cumcount().add(1)
df['Assignment_ID'] += np.where(counts==1, '', '-'+counts.astype(str))
print(df)

输出:

Name Employee Type  ID Primary Contract? Assignment_ID
0    Paulo      Employee  10               Yes           E10
1    Paulo    Contractor  10                No           C10
2    Paulo    Contractor  10                No         C10-2
3    Paulo      Employee  10                No         E10-2
4    Paulo      Employee  10                No         E10-3
5    Pedro      Employee  11                No           E11
6    Pedro    Contractor  11               Yes           C11
7    Jonas    Contractor  16               Yes           C16
8    Jonas    Contractor  16                No         C16-2
9   Felipe    Non Worker  15               Yes           N15
10   Maria      Employee  13                No           E13
11   Maria    Contractor  13               Yes           C13
12   Maria      Employee  13                No         E13-2

最新更新