【问题标题】:Pandas group by operations on a data framePandas 按数据框上的操作分组
【发布时间】:2013-05-17 01:36:12
【问题描述】:

我有一个如下图所示的 pandas 数据框。

UsrId   JobNos
 1       4
 1       56
 2       23 
 2       55
 2       41
 2       5
 3       78
 1       25
 3       1

我根据UsrId 按数据框分组。分组的数据框在概念上如下所示。

UsrId   JobNos
  1    [4,56,25]
  2    [23,55,41,5]
  3    [78,1]

现在,我正在寻找一个内置 API,它将为我提供具有最大作业数的 UsrId。对于上面的示例,UsrId-2 具有最大计数。

更新: 而不是具有最大作业数的UsrID,我想要具有最大作业数的n UserIds。对于上面的示例,如果 n=2 则输出为 [2,1]。这个可以吗?

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    df.groupby('UsrId').JobNos.sum().idxmax() 之类的应该这样做:

    In [1]: import pandas as pd
    
    In [2]: from StringIO import StringIO
    
    In [3]: data = """UsrId   JobNos
       ...:  1       4
       ...:  1       56
       ...:  2       23 
       ...:  2       55
       ...:  2       41
       ...:  2       5
       ...:  3       78
       ...:  1       25
       ...:  3       1"""
    
    In [4]: df = pd.read_csv(StringIO(data), sep='\s+')
    
    In [5]: grouped = df.groupby('UsrId')
    
    In [6]: grouped.JobNos.sum()
    Out[6]: 
    UsrId
    1         85
    2        124
    3         79
    Name: JobNos
    
    In [7]: grouped.JobNos.sum().idxmax()
    Out[7]: 2
    

    如果您希望根据每组中的项目数获得结果:

    In [8]: grouped.size()
    Out[8]: 
    UsrId
    1        3
    2        4
    3        2
    
    In [9]: grouped.size().idxmax()
    Out[9]: 2
    

    更新:要获得有序结果,您可以使用.order 方法:

    In [10]: grouped.JobNos.sum().order(ascending=False)
    Out[10]: 
    UsrId
    2        124
    1         85
    3         79
    Name: JobNos
    

    【讨论】:

    • 感谢您的解决方案。有用。我已经更新了我的问题。您能否看一下并为更新的问题提出解决方案。
    猜你喜欢
    • 2019-04-20
    • 2017-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-29
    • 2019-03-20
    • 2020-10-12
    • 1970-01-01
    相关资源
    最近更新 更多