下表是按职位和部门分类的员工姓名表。我正在尝试添加一个新列,该列应包含与行中名称共享相同部门和职位的其他员工的姓名。我使用了 groupby 和计数函数来隔离包含重复部门 ID 和职位组合的行,但提取共享相同职位的员工的姓名并将它们连接成一个值已证明使用 Python 比较棘手。这是我目前所在的位置:
部门 | 标题 | 姓名 | 计数 |
---|---|---|---|
销售 | 营业员 | 约翰 | 3 |
销售 | 营业员 | 玛丽 | 3 |
销售 | 营业员 | 大卫 | 3 |
销售 | 运营 | 迈克尔 | 2 |
销售 | 运营 | 詹姆斯 | 2 |
我要去的是:
部门 | 标题 | 姓名 | 计数 | 重复的名字 |
---|---|---|---|---|
销售 | 营业员 | 约翰 | 3 | 玛丽,大卫 |
销售 | 营业员 | 玛丽 | 3 | 约翰,大卫 |
销售 | 营业员 | 大卫 | 3 | 约翰,玛丽 |
销售 | 运营 | 迈克尔 | 2 | 詹姆斯 |
销售 | 运营 | 詹姆斯 | 2 | 迈克尔 |
本质上是尝试创建一个新列,其中包含与行中的名称共享头衔和部门的人员的名称。我一直在寻找一个功能来帮助解决这个问题,但这是一个相当晦涩的案例。这在 Excel 中很简单,但有点麻烦,因为某些部门/职位组合根据月份有 20 次或更多次。如果您知道我可以用来完成此任务的 Python 功能或函数序列,或者甚至只是在正确方向上的一点,那将会有很大帮助。
如果我能提供更多细节,请告诉我。谢谢。
您可以尝试使用
set.difference
:
m = df.groupby(['Department', 'Title'])['Name'].agg(set)
df['Duplicate Names'] = df.apply(lambda x: ', '.join(m[(x['Department'], x['Title'])] - {x['Name']}), axis=1)
print(df)
印花:
Department Title Name Count Duplicate Names
0 Sales Salesperson John 3 David, Mary
1 Sales Salesperson Mary 3 John, David
2 Sales Salesperson David 3 John, Mary
3 Sales Operations Michael 2 James
4 Sales Operations James 2 Michael