Python 根据数据帧的组属性筛选数据帧

Python 根据数据帧的组属性筛选数据帧,python,pandas,grouping,Python,Pandas,Grouping,假设我们有问题跟踪日志,我们想找出问题所有者(记录问题时间最多的人) 用户可以多次登录同一问题 如果两个用户同时登录,则两个用户都是所有者 因此,我们有一些样本数据: df = pd.DataFrame([ [1, 10, 'John'], [1, 20, 'John'], [1, 30, 'Tom'], [1, 10, 'Bob'], [2, 25, 'John'], [2, 15, 'Bob']]

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

  • 用户可以多次登录同一问题
  • 如果两个用户同时登录,则两个用户都是所有者
  • 因此,我们有一些样本数据:

    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
    的主人,因为他们都花了30分钟
  • 约翰实际上在两个不同的日子里完成了第1期的工作
  • John也是该期
    2
  • 鲍勃很懒,没有任何问题:)
  • 我的想法让人觉得很恶心(我对Python比较陌生):

    我不喜欢Python代码的地方:

  • 代码> Max TimeSePrimest出现在“代码> df<代码>处理过程中,扰乱思维过程(或管道)
  • 创建
    maxTimesPerIssue
    本身有点混乱
  • 添加
    MaxTimePerIssue
    df
  • 与C版本相比,它显然更不容易解释,因为它使用了很多低级的东西,比如:
    reset\u index()
    list()
    dict()
    ,列表理解,删除列

  • 有人能帮我清理一下吗?

    一些类似于
    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
    

    如果阅读此答案的任何人在理解
    级别的含义时遇到困难(就像我所做的那样),请查看我对级别问题的回答:@gisek对不够清晰表示歉意,虽然你可以问:-)我想你现在已经知道了,但我正在利用中间输出中的多索引,并按照该索引的第0级进行分组。我对你的解决方案如此简洁感到非常兴奋,因此我决定自己做研究,而不是打扰你:)@gisek我很高兴听到这个消息。这个网站可以使用更积极主动的用户,他们不害怕学习,而不是一直被填鸭式的灌输。为你的努力鼓掌,祝你好运!
    
    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