【问题标题】:pandas get minimum of one column in group when groupby another当 groupby 另一个时,pandas 在组中至少获得一列
【发布时间】:2018-12-07 01:34:14
【问题描述】:

我有一个看起来像这样的 pandas 数据框:

      c     y
0     9     0
1     8     0
2     3     1
3     6     2
4     1     3
5     2     3
6     5     3
7     4     4
8     0     4
9     7     4

我想分组y 并获得c 的最小值和最大值,这样我的新数据框将如下所示:

      c     y     min   max
0     9     0     8     9
1     8     0     8     9
2     3     1     3     3   
3     6     2     6     6 
4     1     3     1     5
5     2     3     1     5
6     5     3     1     5
7     4     4     0     7
8     0     4     0     7
9     7     4     0     7

我尝试使用df['min'] = df.groupby(['y'])['c'].min(),但这给了我一些奇怪的结果。前 175 行填充在 min 列中,但其余的都变为 NaN。这不是您应该使用 groupby 方法的方式吗?

【问题讨论】:

    标签: python pandas pandas-groupby


    【解决方案1】:

    Numpy 的恶作剧

    n = df.y.max() + 1
    omax = np.ones(n, df.c.values.dtype) * df.c.values.min()
    omin = np.ones(n, df.c.values.dtype) * df.c.values.max()
    np.maximum.at(omax, df.y.values, df.c.values)
    np.minimum.at(omin, df.y.values, df.c.values)
    
    df.assign(min=omin[df.y], max=omax[df.y])
    
       c  y  min  max
    0  9  0    8    9
    1  8  0    8    9
    2  3  1    3    3
    3  6  2    6    6
    4  1  3    1    5
    5  2  3    1    5
    6  5  3    1    5
    7  4  4    0    7
    8  0  4    0    7
    9  7  4    0    7
    

    【讨论】:

      【解决方案2】:

      选项1使用transform

      In [13]: dfc = df.groupby('y')['c']
      
      In [14]: df.assign(min=dfc.transform(min), max=dfc.transform(max))
      Out[14]:
         c  y  max  min
      0  9  0    9    8
      1  8  0    9    8
      2  3  1    3    3
      3  6  2    6    6
      4  1  3    5    1
      5  2  3    5    1
      6  5  3    5    1
      7  4  4    7    0
      8  0  4    7    0
      9  7  4    7    0
      

      或者

      In [15]: df['min' ] = dfc.transform('min')
      
      In [16]: df['max' ] = dfc.transform('max')
      

      选项 2 使用 join 和 agg

      In [30]: df.join(df.groupby('y')['c'].agg(['min', 'max']), on='y')
      Out[30]:
         c  y  min  max
      0  9  0    8    9
      1  8  0    8    9
      2  3  1    3    3
      3  6  2    6    6
      4  1  3    1    5
      5  2  3    1    5
      6  5  3    1    5
      7  4  4    0    7
      8  0  4    0    7
      9  7  4    0    7
      

      选项 3 使用合并和聚合

      In [28]: df.merge(df.groupby('y')['c'].agg(['min', 'max']), right_index=True, left_on='y')
      Out[28]:
         c  y  min  max
      0  9  0    8    9
      1  8  0    8    9
      2  3  1    3    3
      3  6  2    6    6
      4  1  3    1    5
      5  2  3    1    5
      6  5  3    1    5
      7  4  4    0    7
      8  0  4    0    7
      9  7  4    0    7
      

      【讨论】:

      • 通过管道使用分组df.groupby('y')['c'].pipe(lambda g: df.assign(min=g.transform('min'), max=g.transform('max')))
      猜你喜欢
      • 1970-01-01
      • 2020-06-09
      • 2020-12-08
      • 1970-01-01
      • 1970-01-01
      • 2017-11-07
      • 2019-08-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多