假设我有以下数据集,变成了数据帧:

data = [
    ['Job 1', datetime.date(2019, 6, 9), 'Jim', 'Tom'],
    ['Job 1', datetime.date(2019, 6, 9), 'Bill', 'Tom'],
    ['Job 1', datetime.date(2019, 6, 9), 'Tom', 'Tom'],
    ['Job 1', datetime.date(2019, 6, 10), 'Bill', None],
    ['Job 2', datetime.date(2019,6,10), 'Tom', 'Tom']
]
df = pd.DataFrame(data, columns=['Job', 'Date', 'Employee', 'Manager'])

这会产生一个dataframe,如下所示:

     Job        Date Employee Manager
0  Job 1  2019-06-09      Jim     Tom
1  Job 1  2019-06-09     Bill     Tom
2  Job 1  2019-06-09      Tom     Tom
3  Job 1  2019-06-10     Bill    None
4  Job 2  2019-06-10      Tom     Tom

我想要生成的是每个独特的Job/Date组合上的pivot,一个用于Manager的列,一个用于string与comma分离的non-manager员工的列。有几件事要假设:

  1. 所有员工姓名都是独一无二的(我实际上是使用独特的员工ID而不是姓名),而经理人也是"employees",所以永远不会有员工和经理共享相同的name/id,而是不同的个人。
  2. 工作人员可以有一个经理,或者没有经理(参见id为3的行,例如没有)
  3. 经理也将始终列为员工(请参阅ID为2或4的行)
  4. 一个工作可以有一个经理,没有额外的员工(参见第4行)

我希望生成的dataframe看起来像:

     Job        Date  Manager     Employees
0  Job 1  2019-06-09      Tom     Jim, Bill
1  Job 1  2019-06-10     None          Bill
2  Job 2  2019-06-10      Tom          None

这引出了我的问题:

  1. 有没有办法在pandas pivot中加入','。聚合?
  2. 有没有办法使这种聚合成为条件(在经理列中排除name/id)

我怀疑1)是可能的,2)可能更难。如果2)是no,我可以稍后在我的代码中以其他方式绕过它。

分析解答

要聚合的组,然后通过删除管理器并在适当的位置设置为“无”来修复“员工”。

s = df.groupby(['Job', 'Date']).agg({'Manager': 'first', 'Employee': lambda x: set(x)})
s['Employee'] = [', '.join(x.difference({y})) for x,y in zip(s.Employee, s.Manager)]
s['Employee'] = s.Employee.replace({'': None})

                 Manager   Employee
Job   Date                         
Job 1 2019-06-09     Tom  Jim, Bill
      2019-06-10    None       Bill
Job 2 2019-06-10     Tom       None