根据组属性过滤DataFrame

时间:2018-04-30 22:23:15

标签: python pandas grouping

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

  1. 用户可以多次将时间记录到同一问题
  2. 如果2个用户同时登录,则两者都是所有者
  3. 所以我们有一些样本数据:

    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. John和Tom都是问题1的所有者,因为他们都花了30分钟。
    2. John实际上在2个不同的日子里处理问题1
    3. John也是问题所有者2
    4. Bob很懒,没有任何问题:)
    5. 我提出的感觉非常恶心(我对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#版本那么容易解释LI>

        有人可以帮我清理吗?

1 个答案:

答案 0 :(得分:1)

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