簡體   English   中英

pandas根據另一列中的值創建一個列,該列選擇作為條件

[英]pandas create a column based on values in another column which selected as conditions

我有以下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 ,指示(boolean)如果對於特定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的值未知時,代碼可以自動枚舉所有可能的值,然后相應地進行計算。

我相信需要groupby by 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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM