【问题标题】:Max and min from two series in pandas groupbypandas groupby 中两个系列的最大值和最小值
【发布时间】:2018-04-12 02:17:49
【问题描述】:

是否可以从 groupby 中的两个系列中获取最小值和最大值?

例如在以下情况下,当按c 分组时,如何同时获取a 和b 的最小值和最大值?

df = pd.DataFrame({'a': [10,20,3,40,55], 'b': [5,14,8,50,60], 'c': ['x','x','y','y','y']})
g = df.groupby(df.c)
for key, item in g:
    print (g.get_group(key), "\n")

    a   b  c
0  10   5  x
1  20  14  x

    a   b  c
2   3   8  y
3  40  50  y
4  55  60  y

我已经通过获取每个分组系列的最小值和最大值然后找到_min/_max 系列的最小值和最大值来解决这个问题:

df['a_min'] = g['a'].transform('min')
df['a_max'] = g['a'].transform('max')
df['b_min'] = g['b'].transform('min')
df['b_max'] = g['b'].transform('max')
df['min'] = df[['a_min', 'a_max', 'b_min', 'b_max']].min(axis=1)
df['max'] = df[['a_min', 'a_max', 'b_min', 'b_max']].max(axis=1)

    a   b  c  a_min  a_max  b_min  b_max  min  max
0  10   5  x     10     20      5     14    5   20
1  20  14  x     10     20      5     14    5   20
2   3   8  y      3     55      8     60    3   60
3  40  50  y      3     55      8     60    3   60
4  55  60  y      3     55      8     60    3   60

这会产生我想要的输出,但有很多额外的系列。我想知道是否有更好的方法来做到这一点?

【问题讨论】:

    标签: python pandas pandas-groupby


    【解决方案1】:

    用途:

    df = df.join(df.melt('c').groupby('c')['value'].agg(['min','max']), 'c')
    print (df)
        a   b  c  min  max
    0  10   5  x    5   20
    1  20  14  x    5   20
    2   3   8  y    3   60
    3  40  50  y    3   60
    4  55  60  y    3   60
    

    详情:

    需要一列包含a 和b 值的melt:

    print (df.melt('c'))
       c variable  value
    0  x        a     10
    1  x        a     20
    2  y        a      3
    3  y        a     40
    4  y        a     55
    5  x        b      5
    6  x        b     14
    7  y        b      8
    8  y        b     50
    9  y        b     60
    

    然后通过groupby和agg聚合min和max:

    print(df.melt('c').groupby('c')['value'].agg(['min','max']))
       min  max
    c          
    x    5   20
    y    3   60
    

    最后join 为原始。

    【讨论】:

      【解决方案2】:

      使用transformstill ok,你只需要为你的transform结果添加min(axis=1)

      df['min'],df['max']=df.groupby('c').transform('min').min(1),df.groupby('c').transform('max').max(1)
      df
      Out[88]: 
          a   b  c  min  max
      0  10   5  x    5   20
      1  20  14  x    5   20
      2   3   8  y    3   60
      3  40  50  y    3   60
      4  55  60  y    3   60
      

      如果有您不想包含的系列,例如排除f,则应在分组后列出系列

          a   b  c   f
      0  10   5  x   0
      1  20  14  x  45
      2   3   8  y  67
      3  40  50  y  17
      4  55  60  y  91
      
      df['min'] = df.groupby('c')[['a', 'b']].transform('min').min(axis=1)
      df['max'] = df.groupby('c')[['a', 'b']].transform('max').max(axis=1)
      

      【讨论】:

        猜你喜欢
        • 2021-08-01
        • 2018-03-12
        • 2019-09-05
        • 2021-12-15
        • 2019-08-16
        • 1970-01-01
        • 1970-01-01
        • 2019-10-18
        • 2017-11-07
        相关资源
        最近更新 更多