代码之家  ›  专栏  ›  技术社区  ›  daiyue

pandas基于另一列中的值创建列,该列被选为条件

  •  1
  • daiyue  · 技术社区  · 6 年前

    我有以下的 df ,

    id    match_type    amount    negative_amount
    1     exact         10        False
    1     exact         20        False
    1     name          30        False
    1     name          40        False
    1     amount        15        True
    1     amount        15        True 
    2     exact         0         False
    2     exact         0         False
    

    我想创建一个列 0_amount_sum 表示(布尔值)如果 amount 对于特定的每个id,sum是否为<=0 match_type ,例如,结果如下 东风 ;

    id    match_type    amount    0_amount_sum    negative_amount   
    1     exact         10        False           False
    1     exact         20        False           False
    1     name          30        False           False
    1     name          40        False           False
    1     amount        15        True            True
    1     amount        15        True            True
    2     exact         0         True            False
    2     exact         0         True            False
    

    对于 id=1 match_type=exact , the 数量 总数是30,所以 0-金额总和 False . 代码如下:

    df = df.loc[df.match_type=='exact']
    
    df['0_amount_sum_'] = (df.assign(
        amount_n=df.amount * np.where(df.negative_amount, -1, 1)).groupby(
        'id')['amount_n'].transform(lambda x: sum(x) <= 0))
    
    df = df.loc[df.match_type=='name']
    
    df['0_amount_sum_'] = (df.assign(
        amount_n=df.amount * np.where(df.negative_amount, -1, 1)).groupby(
        'id')['amount_n'].transform(lambda x: sum(x) <= 0))
    
    df = df.loc[df.match_type=='amount']
    
    df['0_amount_sum_'] = (df.assign(
        amount_n=df.amount * np.where(df.negative_amount, -1, 1)).groupby(
        'id')['amount_n'].transform(lambda x: sum(x) <= 0))
    

    我想知道是否有更好的方法/更有效地做到这一点,特别是当 匹配型 未知,因此代码可以自动枚举所有可能的值,然后进行相应的计算。

    1 回复  |  直到 6 年前
        1
  •  3
  •   jezrael    6 年前

    我相信需要 groupby 2 Series (列)而不是筛选:

    df['0_amount_sum_'] = ((df.amount * np.where(df.negative_amount, -1, 1))
                               .groupby([df['id'], df['match_type']])
                               .transform('sum')
                               .le(0))
    
       id match_type  amount  negative_amount  0_amount_sum_
    0   1      exact      10            False          False
    1   1      exact      20            False          False
    2   1       name      30            False          False
    3   1       name      40            False          False
    4   1     amount      15             True           True
    5   1     amount      15             True           True
    6   2      exact       0            False           True
    7   2      exact       0            False           True