熊猫根据另一列中的值创建一列,该列被选为条件



我有以下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,指示(布尔值(对于特定match_type的每个 id 的amount和是否为 <= 0,例如以下是结果df;

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=1match_type=exactamount和是 30,所以0_amount_sumFalse。代码如下,

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))

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

我相信需要groupby2Series(列(而不是过滤:

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

最新更新