gpt4 book ai didi

python - 如何根据连续行在 Pandas 中进行透视和聚合,而两列没有变化?

转载 作者:行者123 更新时间:2023-12-01 07:35:26 25 4
gpt4 key购买 nike

假设我有以下数据,并且需要下面显示的输出。

import pandas as pd

data = [
{'job_id': 1, 'employee': 'Joe', 'date': datetime.date(2019, 6, 10)},
{'job_id': 1, 'employee': 'Joe', 'date': datetime.date(2019, 6, 11)},
{'job_id': 2, 'employee': 'Joe', 'date': datetime.date(2019, 6, 12)},
{'job_id': 2, 'employee': 'Joe', 'date': datetime.date(2019, 6, 13)},
{'job_id': 1, 'employee': 'Joe', 'date': datetime.date(2019, 6, 14)},
{'job_id': 1, 'employee': 'Joe', 'date': datetime.date(2019, 6, 17)},
{'job_id': 2, 'employee': 'Jill', 'date': datetime.date(2019, 6, 10)},
{'job_id': 2, 'employee': 'Jill', 'date': datetime.date(2019, 6, 11)},
{'job_id': 1, 'employee': 'Jill', 'date': datetime.date(2019, 6, 12)},
{'job_id': 1, 'employee': 'Jill', 'date': datetime.date(2019, 6, 13)},
{'job_id': 3, 'employee': 'Jill', 'date': datetime.date(2019, 6, 14)}
]

data_df = pd.DataFrame(data)

output_data = [
{'job_id': 1, 'employee': 'Joe', 'start_date': datetime.date(2019, 6, 10), 'end_date': datetime.date(2019, 6, 11)},
{'job_id': 2, 'employee': 'Joe', 'start_date': datetime.date(2019, 6, 12), 'end_date': datetime.date(2019, 6, 13)},
{'job_id': 1, 'employee': 'Joe', 'start_date': datetime.date(2019, 6, 14), 'end_date': datetime.date(2019, 6, 17)},
{'job_id': 2, 'employee': 'Jill', 'start_date': datetime.date(2019, 6, 10), 'end_date': datetime.date(2019, 6, 11)},
{'job_id': 1, 'employee': 'Jill', 'start_date': datetime.date(2019, 6, 12), 'end_date': datetime.date(2019, 6, 13)},
{'job_id': 3, 'employee': 'Jill', 'start_date': datetime.date(2019, 6, 14), 'end_date': datetime.date(2019, 6, 14)}
]

output_df = pd.DataFrame(output_data)

本质上,我按照员工对表格进行排序,然后按升序日期排序。我需要汇总给定工作的员工的开始/结束日期。有几点需要注意:

  1. 员工可以先做一份工作,调到另一份工作,然后再回到第一份工作(参见 Joe - 他先做工作 1,然后再做工作 2,然后又回到工作 1)。这应该显示每个转换的条目(请参阅输出数据中的行)。
  2. 该员工可能不会连续几天在工作(例如,周末休息 2 天),但如果他在周四和周五工作,然后在周一返回工作,那么都会得到一个周四至周一入场。再次请参阅 Joe,了解他在作业 1 上的第二天。
  3. 一名员工可能只工作一天。在本例中,start_date 和 end_date 应为同一天(请参阅作业 3 上的 Jill)。
  4. 一名员工每天只能从事一项工作。

如果不是连续的时间段,我只需使用数据透视表,按用户/作业进行分组,并按最大和最小日期进行聚合。但是,当我查找具有相同 employeejob_id 的连续行时,我不确定如何进行分组。

最佳答案

IIUC,你可以通过两个groupby来做到这一点:

# to mask the jobs chunks separately
s = data_df.groupby('employee').job_id.apply(lambda x: x.ne(x.shift()).cumsum())

out_df = data_df.groupby(['employee', s]).agg({'job_id':'first', 'date':{'min','max'}})

给出:

                job_id        date            
job_id max min
employee job_id
Jill 1 2 2019-06-11 2019-06-10
2 1 2019-06-13 2019-06-12
3 3 2019-06-14 2019-06-14
Joe 1 1 2019-06-11 2019-06-10
2 2 2019-06-13 2019-06-12
3 1 2019-06-17 2019-06-14

可以通过以下方式更改为您的表单:

out_df.columns = ['job_id', 'end_date', 'start_date']
out_df = out_df.reset_index(level=1,drop=True).reset_index()

关于python - 如何根据连续行在 Pandas 中进行透视和聚合,而两列没有变化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57012242/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com