基于组属性过滤数据帧

2024-09-30 02:15:03 发布

您现在位置:Python中文网/ 问答频道 /正文

假设我们有问题跟踪日志,我们想找出问题所有者(记录问题时间最多的人)

  1. 用户可以多次登录同一问题
  2. 如果两个用户同时登录,则两个用户都是所有者

我们有一些样本数据:

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'])

作为输出,我们需要如下内容:

issues_owners = pd.DataFrame([
        [1, 30, 'John'],
        [1, 30, 'Tom'],
        [2, 25, 'John']], columns = ['IssueKey','TimeSpent','User'])
  1. 约翰和汤姆都是第1期的所有者,因为他们都花了30分钟。你知道吗
  2. 约翰实际上在两个不同的日子里研究了问题1
  3. 约翰也是这个问题的所有者2
  4. 鲍勃很懒,没有任何问题:)

我想到的感觉非常恶心(我对Python比较陌生):

df = df.groupby(['IssueKey', 'User']).sum().reset_index()
maxTimesPerIssue = df.groupby('IssueKey')['TimeSpent'].max().reset_index()
maxTimesPerIssue = dict(zip(maxTimesPerIssue['IssueKey'], maxTimesPerIssue['TimeSpent']))
df['MaxTimePerIssue'] = [maxTimesPerIssue[key] for key in df['IssueKey']]
df = df[df.MaxTimePerIssue == df.TimeSpent]
df = df.drop(columns=['MaxTimePerIssue'])   

我不喜欢Python代码的地方:

  1. maxTimesPerIssue出现在处理df中断思维过程(或管道)的过程中
  2. 创建maxTimesPerIssue本身有点混乱
  3. MaxTimePerIssue加到df
  4. 由于使用了大量的底层内容,例如:reset_index()list()dict()、列表理解、删除列,因此它肯定没有C版本那么容易解释

有人能帮我打扫一下吗?你知道吗


Tags: columns用户dataframedfindexjohnpdbob
1条回答
网友
1楼 · 发布于 2024-09-30 02:15:03

一些类似于groupby的东西将适用于您的数据:

i = df.groupby(['IssueKey', 'User']).TimeSpent.sum()
j = i.groupby(level=0).transform('max')

i[i == j].reset_index()

   IssueKey  User  TimeSpent
0         1  John         30
1         1   Tom         30
2         2  John         25

相关问题 更多 >

    热门问题