对熊猫数据框中的一列求和,其中一列满足条件,但另一列分组

时间:2019-12-05 12:37:16

标签: python pandas dataframe pandas-groupby

我有一个这样的数据框:

        Ref_No  Definition  Total_to_Add
    0   ref1        B            20        
    1   ref2        A            30        
    2   ref1        B            40        
    3   ref2        A            50        
    4   ref1        B            60        
    5   ref2        B            50         
    6   ref1        B            60        
    7   ref2        B            50        
    8   ref1        B            60        

对于每个参考,如果它们是'B'并且参考号相同,我想对Total_to_Add求和(我将在A的另一列中)。有100的参考编号。

我可以将满足单个条件的那些相加:

df['ANSWER'] = df[df['Definition']=='A']['Total_to_Add'].sum()

或者我可以按如下引用进行分组:

df['ANSWER']=(df.groupby('Ref_No')['Total_to_Add'].transform('sum'))

但是我似乎无法结合使用这些功能,即创建一个新列,如果定义为“ B”,则将其总计,并由Ref_No总计。

我的目标是输出如下内容:

        Ref_No  Definition  Total_to_Add  Total_'B'
    0   ref1        B            20        240
    1   ref2        A            30        100
    2   ref1        B            40        240
    3   ref2        A            50        100
    4   ref1        B            60        240
    5   ref2        B            50        100 
    6   ref1        B            60        240
    7   ref2        B            50        100
    8   ref1        B            60        240

任何智慧表示赞赏!谢谢

4 个答案:

答案 0 :(得分:2)

通过Series.where将非B的值替换为0,然后使用GroupBy.transform

df['ANSWER']= (df['Total_to_Add'].where(df.Definition=='B', 0)
                                 .groupby(df['Ref_No']).transform('sum'))
print (df)
  Ref_No Definition  Total_to_Add  Total_'B'  ANSWER
0   ref1          B            20        240     240
1   ref2          A            30        100     100
2   ref1          B            40        240     240
3   ref2          A            50        100     100
4   ref1          B            60        240     240
5   ref2          B            50        100     100
6   ref1          B            60        240     240
7   ref2          B            50        100     100
8   ref1          B            60        240     240

答案 1 :(得分:2)

尝试:

df['Total_B'] = (df['Definition'].eq('B').mul(df['Total_to_Add'])
                 .groupby(df['Ref_No']).transform('sum'))

[出]

  Ref_No Definition  Total_to_Add  Total_B
0   ref1          B            20      240
1   ref2          A            30      100
2   ref1          B            40      240
3   ref2          A            50      100
4   ref1          B            60      240
5   ref2          B            50      100
6   ref1          B            60      240
7   ref2          B            50      100
8   ref1          B            60      240

答案 2 :(得分:1)

如果'Definition'=='B',这将在'Total_B'列中产生'Total_to_Add'的总和。 df['Total_B']=df[df['Definition']=='B'].groupby(by=['Ref_No','Definition'])['Total_to_Add'].transform('sum')

答案 3 :(得分:1)

我会做transform

s=df['Total_to_Add'].mask(df.Definition!='B').groupby(df['Ref_No']).transform('sum')
s
0    240.0
1    100.0
2    240.0
3    100.0
4    240.0
5    100.0
6    240.0
7    100.0
8    240.0
Name: Total_to_Add, dtype: float64

df['New']=s