假设我有以下数据集,变成了一个数据框:
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'])
这会产生一个如下所示的数据框:
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
我试图生成的是每个独特的工作/日期组合的枢轴,一列用于经理,一列用于字符串,其中以逗号分隔,非经理员工。假设有几件事:
- 所有员工姓名都是唯一的(实际上我将使用唯一的员工 ID 而不是姓名),并且经理也是“员工”,因此永远不会出现员工和经理共享相同姓名/ID 的情况, 但不同的个体。
- 一个工作组可以有经理,也可以没有(参见 id 为 3 的行,没有的例子)
- 经理也总是会被列为员工(参见 id 为 2 或 4 的行)
- 一个工作可以有一个经理,没有额外的员工(见第 id 4 行)
我希望生成的数据框看起来像:
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
这引出了我的问题:
- 有没有办法在 pandas 数据透视表中执行类似“,”.join 的聚合?
- 有没有办法使这个聚合有条件(排除经理列中的名称/ID)
我怀疑 1) 是可能的,而 2) 可能更难。如果 2) 是否定的,我可以稍后在我的代码中以其他方式绕过它。
最佳答案
这里棘手的部分是从 Employee 列中删除经理。
u = df.melt(['Job', 'Date'])
f = u[~u.duplicated(['Job', 'Date', 'value'], keep='last')].astype(str)
f.pivot_table(
index=['Job', 'Date'],
columns='variable', values='value',
aggfunc=','.join
).rename_axis(None, axis=1)
Employee Manager
Job Date
Job 1 2019-06-09 Jim,Bill Tom
2019-06-10 Bill None
Job 2 2019-06-10 NaN Tom
关于python - Pandas -将列旋转成(条件)聚合字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56739501/