我有一个包含员工姓名的数据框架,每行代表他们的合同信息,他们合同的员工类型,合同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