代码之家  ›  专栏  ›  技术社区  ›  Daniel Zapata

熊猫:使用groupby计算添加标志

  •  1
  • Daniel Zapata  · 技术社区  · 6 年前

    我想首先得到第三个按分组的分位数(本例中为group和level)。

    d = pd.DataFrame({'customer': ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10'], 
                      'group': ['A', 'B', 'B', 'A', 'B', 'A', 'B', 'A', 'B', 'A'],
                      'level': ['Z', 'X', 'X', 'X', 'Z', 'Z', 'Z', 'X', 'X', 'Z'],
                      'value': [0.4, 0.6, 0.7, 0.6, 0.3, 0.5, 0.2, 0.7, 0.5, 0.2]})
    
    d.groupby(['group', 'level']).quantile(0.75)
    

       0.75 value
    group   level   
    A   X   0.67
        Z   0.45
    B   X   0.65
        Z   0.27
    

        customer    group   level   value     new
           1          A       Z       0.40     1
           2          B       X       0.60     0
    

    谢谢

    2 回复  |  直到 6 年前
        1
  •  1
  •   sacuL    6 年前

    IIUC公司:

    d['new'] = (d.value > d.groupby(['group', 'level'])['value']
                           .transform('quantile', 0.75)).astype(int)
    
    >>> d
      customer group level  value  new
    0        1     A     Z    0.4    0
    1        2     B     X    0.6    0
    2        3     B     X    0.7    1
    3        4     A     X    0.6    0
    4        5     B     Z    0.3    1
    5        6     A     Z    0.5    1
    6        7     B     Z    0.2    0
    7        8     A     X    0.7    1
    8        9     B     X    0.5    0
    9       10     A     Z    0.2    0
    
        2
  •  0
  •   rafaelc    6 年前

    仅使用 lt 和索引匹配

    q = d.groupby(['group', 'level']).quantile(0.75)
    d.set_index(['group', 'level']).value.lt(q.value).astype(int)
    
    group  level
    A      X        1
           X        0
           Z        1
           Z        0
           Z        1
    B      X        1
           X        0
           X        1
           Z        0
           Z        1
    Name: value, dtype: int64