python - Pandas -将列旋转成(条件)聚合字符串

标签 python pandas pivot-table aggregation

假设我有以下数据集,变成了一个数据框:

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

我试图生成的是每个独特的工作/日期组合的枢轴,一列用于经理,一列用于字符串,其中以逗号分隔,非经理员工。假设有几件事:

  1. 所有员工姓名都是唯一的(实际上我将使用唯一的员工 ID 而不是姓名),并且经理也是“员工”,因此永远不会出现员工和经理共享相同姓名/ID 的情况, 但不同的个体。
  2. 一个工作组可以有经理,也可以没有(参见 id 为 3 的行,没有的例子)
  3. 经理也总是会被列为员工(参见 id 为 2 或 4 的行)
  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

这引出了我的问题:

  1. 有没有办法在 pandas 数据透视表中执行类似“,”.join 的聚合?
  2. 有没有办法使这个聚合有条件(排除经理列中的名称/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/

相关文章:

python - Python itertools groupby 中令人不安的奇怪行为/错误?

python - 在 Django 中提交表单后重定向到索引页面

mysql - 为什么我们应该将外键定义为数据透视表中的主键?

python - 如何在 Python Pivot_table 中使用 agg_func = 'All'

基于 Python Rate Limit 类的 View Flask

python - pymongo 或 VERSION 中不存在 FIND 方法?

python - 如何将 DatetimeIndexResampler 转换为 DataFrame?

python - 使用来自多个表的随机行的 SELECT UNION 查询

python - 完全相同的文本字符串不匹配

php - 规范化的 MySQL 数据透视/行到没有唯一名称的列