pandas 将df行聚合到一列中,同时保留每行的唯一属性

jaql4c8m  于 12个月前  发布在  其他
关注(0)|答案(1)|浏览(97)

我有一个以下的df(过滤版本为一个单一的工作#)
| 指数|作业编号|名称|时间活动|客户ID|发票日期|完成日期|发票编号|地位|作业类型|总收入|总成本|总利润|职位毛利率%|技术人员|主要技术人员|业务部门|现行工资|预订了住宿|工号|定期活动日期|
| --|--|--|--|--|--|--|--|--|--|--|--|--|--|--|--|--|--|--|--|--|
| 5123 |56618.0|卡洛斯梅萨|驱动|邮编:5779854.0| 2023-10-26 00:00:00| 2023-10-26 00:00:00| 56618.0|完成|二手车(已出售)|18828.33| 14484.21| 4344.12|电话:+86-072253354386715|唐纳德·皮尔森、卡洛斯·梅扎、约书亚威廉姆斯|卡洛斯梅萨|门通信|1.0版|迈克·贝利|56618.0| 2023-10-24 00:00:00 2023-10-25 00:00:00|
| 5124 |56618.0|卡洛斯梅萨|工作|邮编:5779854.0| 2023-10-26 00:00:00| 2023-10-26 00:00:00| 56618.0|完成|二手车(已出售)|18828.33| 14484.21| 4344.12|电话:+86-072253354386715|唐纳德·皮尔森、卡洛斯·梅扎、约书亚威廉姆斯|卡洛斯梅萨|门通信|1.0版|迈克·贝利|56618.0| 2023-10-24 00:00:00 2023-10-25 00:00:00|
| 5125 |56618.0|唐纳德·皮尔森|驱动|邮编:5779854.0| 2023-10-26 00:00:00| 2023-10-26 00:00:00| 56618.0|完成|二手车(已出售)|18828.33| 14484.21| 4344.12|电话:+86-072253354386715|唐纳德·皮尔森、卡洛斯·梅扎、约书亚威廉姆斯|卡洛斯梅萨|门通信|1.0版|迈克·贝利|56618.0| 2023-10-24 00:00:00 2023-10-26 00:00:00|
| 5126 |56618.0|唐纳德·皮尔森|工作|邮编:5779854.0| 2023-10-26 00:00:00| 2023-10-26 00:00:00| 56618.0|完成|二手车(已出售)|18828.33| 14484.21| 4344.12|电话:+86-072253354386715|唐纳德·皮尔森、卡洛斯·梅扎、约书亚威廉姆斯|卡洛斯梅萨|门通信|1.0版|迈克·贝利|56618.0| 2023-10-24 00:00:00 2023-10-25 00:00:00 2023-10-26 00:00:00|
| 5127 |56618.0|约书亚威廉姆斯|驱动|邮编:5779854.0| 2023-10-26 00:00:00| 2023-10-26 00:00:00| 56618.0|完成|二手车(已出售)|18828.33| 14484.21| 4344.12|电话:+86-072253354386715|唐纳德·皮尔森、卡洛斯·梅扎、约书亚威廉姆斯|卡洛斯梅萨|门通信|1.0版|迈克·贝利|56618.0| 2023-10-24 00:00:00 2023-10-26 00:00:00|
| 5128 |56618.0|约书亚威廉姆斯|工作|邮编:5779854.0| 2023-10-26 00:00:00| 2023-10-26 00:00:00| 56618.0|完成|二手车(已出售)|18828.33| 14484.21| 4344.12|电话:+86-072253354386715|唐纳德·皮尔森、卡洛斯·梅扎、约书亚威廉姆斯|卡洛斯梅萨|门通信|1.0版|迈克·贝利|56618.0| 2023-10-24 00:00:00 2023-10-26 00:00:00|
| 5129 |56618.0|凯尔文·泰勒|驱动|邮编:5779854.0| 2023-10-26 00:00:00| 2023-10-26 00:00:00| 56618.0|完成|二手车(已出售)|18828.33| 14484.21| 4344.12|电话:+86-072253354386715|唐纳德·皮尔森、卡洛斯·梅扎、约书亚威廉姆斯|卡洛斯梅萨|门通信|1.0版|迈克·贝利|56618.0| 2023-07-11 00:00:00|
| 5130 |56618.0|凯尔文·泰勒|工作|邮编:5779854.0| 2023-10-26 00:00:00| 2023-10-26 00:00:00| 56618.0|完成|二手车(已出售)|18828.33| 14484.21| 4344.12|电话:+86-072253354386715|唐纳德·皮尔森、卡洛斯·梅扎、约书亚威廉姆斯|卡洛斯梅萨|门通信|1.0版|迈克·贝利|56618.0| 2023-07-11 00:00:00|
现在我想要的是,对于单个作业#,应该只有一行,并且要保留活动和活动时间的每个技术人员详细信息,
我试图通过聚合df来实现这一点,但问题是这样做会丢失每个Name和Technician Activity的唯一标识。
我期待的是:
| 指数|客户ID|发票日期|完成日期|作业编号|发票编号|技术人员|主要技术人员|技术人员支付的总时间|业务部门|现行工资|预订了住宿|工号|技术员#1|驾驶活动日期#1|时间活动#1|总行驶时间(12月)#1|工作活动日期#1|活动#1|总工作时间#1|技术员#2|
| --|--|--|--|--|--|--|--|--|--|--|--|--|--|--|--|--|--|--|--|--|
| 0 |邮编:5779854.0| 2023-10-26 00:00:00| 2023-10-26 00:00:00| 56618.0| 56618.0|唐纳德·皮尔森、卡洛斯·梅扎、约书亚威廉姆斯|卡洛斯梅萨|50.8833333|门通信|1.0版|迈克·贝利|56618.0|卡洛斯梅萨|2023年10月24日,2023年10月25日|驱动|0.9| 2023-10-24,2023-10-24,2023-10-25|工作|14.3333333|唐纳德·皮尔森|

euoag5mw

euoag5mw1#

这个问题的解决方案是在按“Job #"分组后应用自定义聚合函数,此自定义聚合函数将对每个组执行所需的转换。

def custom_aggregate(group):
    # Assuming you want to concatenate unique activities for each name
    names = group['Name'].unique()
    c = 1
    for n in names:
        group[f"technician {c}"] = n
        for ac, sub_group in group[group["Name"] == n].groupby("Timesheet Activity"):
            group[f'technician {c} {ac} Activity'] = ac
            group[f'technician {c} {ac} Activity Duration'] = sub_group["Duration (Decimal)"].values[0]
            group[f'technician {c} {ac} Activity Dates'] = sub_group["Timesheet Activity Date"].values[0]
        c += 1
    return group

result_df = aggregated_df.groupby('Job #').apply(custom_aggregate)

字符串
自定义聚合函数中的循环将遍历该作业号的每个名称,并为每个技术人员名称创建新列,然后再次对时间表活动进行子分组,并为相应的活动创建列。

相关问题