我有一个这样的数据框:
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
任何智慧表示赞赏!谢谢
答案 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