基于分组属性过滤DataFrame:定位工单耗时最多负责人
解决问题:找出每个工单的耗时最多负责人
没问题,我来帮你搞定这个需求——从问题追踪系统的日志数据里,找出每个工单的负责人(即该工单上总耗时最多的用户),如果有多名用户总耗时相同,那就全部列为负责人。
第一步:准备示例数据
先把你给出的示例数据用pandas加载好:
import pandas as pd df = pd.DataFrame([ [1, 10, 'John'], [1, 20, 'John'], [1, 30, 'Tom'], [1, 10, 'Bob'], [2, 25, 'John'], [2, 15, 'Bob'] ], columns=['IssueKey','TimeSpent','User'])
第二步:计算每个用户在工单上的总耗时
首先按IssueKey(工单编号)和User(用户)分组,统计每个用户在对应工单上的累计耗时:
# 分组计算每个用户的工单总耗时 user_time_totals = df.groupby(['IssueKey', 'User'])['TimeSpent'].sum().reset_index()
这一步会得到每个用户在各工单的总耗时结果:
IssueKey User TimeSpent 0 1 Bob 10 1 1 John 30 2 1 Tom 30 3 2 Bob 15 4 2 John 25
第三步:找出每个工单的最大耗时值
接下来,我们需要知道每个工单的最高总耗时是多少,这样才能筛选出达到这个值的用户:
# 计算每个工单的最大总耗时 max_time_per_issue = user_time_totals.groupby('IssueKey')['TimeSpent'].max().reset_index(name='MaxTotalTime')
结果如下:
IssueKey MaxTotalTime 0 1 30 1 2 25
第四步:筛选出每个工单的负责人
把上面两个结果合并,然后筛选出总耗时等于该工单最大值的用户,就是我们要找的负责人:
# 合并数据并筛选负责人 issues_owners = pd.merge(user_time_totals, max_time_per_issue, on='IssueKey') issues_owners = issues_owners[issues_owners['TimeSpent'] == issues_owners['MaxTotalTime']] # 可选:重命名列让结果更清晰 issues_owners = issues_owners.rename(columns={'TimeSpent': 'TotalTimeSpent'})
最终的issues_owners结果就是:
IssueKey User TotalTimeSpent MaxTotalTime 1 1 John 30 30 2 1 Tom 30 30 4 2 John 25 25
可选:将同一工单的负责人合并到一行
如果希望同一个工单的负责人显示在同一行(用逗号分隔),可以再做一步聚合:
issues_owners_combined = issues_owners.groupby('IssueKey').agg( MaxTotalTime=('MaxTotalTime', 'first'), Owners=('User', ', '.join) ).reset_index()
这会得到更紧凑的结果:
IssueKey MaxTotalTime Owners 0 1 30 John, Tom 1 2 25 John
内容的提问来源于stack exchange,提问作者Andrzej Gis
相关产品推荐
相关产品推荐

