【问题标题】:Python Pandas group by functionPython Pandas 按功能分组
【发布时间】:2017-01-15 05:29:25
【问题描述】:

我有这张桌子

    uname   sid usage
0   Ahmad   a   5
1   Ahmad   a   7
2   Ahmad   a   10
3   Ahmad   b   2
4   Mohamad c   6
5   Mohamad c   7
6   Mohamad c   9

我想按 unname 和 side 进行分组,并且使用列 = group.max - group.min。但是如果组数是1,则返回组max

输出应该是

    uname   sid usage
0   Ahmad   a   5
1   Ahmad   b   2
2   Mohamad c   3    

【问题讨论】:

    标签: python pandas group-by max min


    【解决方案1】:

    首先,使用agg抓取每个组的minmaxsize
    然后将min 乘以size > 1。如果是,它将等于min,否则等于0。然后从max 中减去它。

    d1 = df.groupby(['uname', 'sid']).usage.agg(['min', 'max', 'size'])
    d1['max'].sub(d1['min'].mul(d1['size'].gt(1))).reset_index(name='usage')
    

    【讨论】:

    • 也许更好的是使用d1['max'].sub(d1['min'].mul(d1['size'].gt(1))).reset_index(name='usage')
    【解决方案2】:

    您可以使用groupbyapply 区别maxmin 如果length 更多为1 否则max

    df = df.groupby(['uname','sid'])['usage']
           .apply(lambda x: x.max()-x.min() if len(x) > 1 else x.max())
           .reset_index()
    print (df)
         uname sid  usage
    0    Ahmad   a      5
    1    Ahmad   b      2
    2  Mohamad   c      3
    

    我认为max 你也可以使用iloc

    df = df.groupby(['uname','sid'])['usage']
           .apply(lambda x: x.max()-x.min() if len(x) > 1 else x.iloc[0])
           .reset_index()
    print (df)
         uname sid  usage
    0    Ahmad   a      5
    1    Ahmad   b      2
    2  Mohamad   c      3
    

    另一个使用Series.where 的解决方案,测试size

    g = df.groupby(['uname','sid'])['usage']
    s = g.max()-g.min()
    print (s)
    uname    sid
    Ahmad    a      5
             b      0
    Mohamad  c      3
    Name: usage, dtype: int64
    
    print (g.size() == 1)
    uname    sid
    Ahmad    a      False
             b       True
    Mohamad  c      False
    dtype: bool
    
    print (s.where(g.size() != 1, g.max()).reset_index())
         uname sid  usage
    0    Ahmad   a      5
    1    Ahmad   b      2
    2  Mohamad   c      3
    

    【讨论】:

      猜你喜欢
      • 2016-03-14
      • 2020-12-11
      • 1970-01-01
      • 1970-01-01
      • 2015-07-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多