Python 如何根据其他列中的值聚合列上的总和

Python 如何根据其他列中的值聚合列上的总和,python,pandas,dataframe,aggregation,pandas-groupby,Python,Pandas,Dataframe,Aggregation,Pandas Groupby,我试图通过groupby对第二列中的值求和,但同时也考虑第三列中的值,df如下所示 id memo amount 1 pos 1.0 1 pos 2.0 1 neg 3.0 2 pos 4.0 2 pos 5.0 2 neg 6.0 2 neg 7.0 我想按id和sumamount进行分组,但如果memo是pos的话,每组都是正数,neg是负数,例如当group

我试图通过
groupby
对第二列中的值求和,但同时也考虑第三列中的值,
df
如下所示

id    memo    amount   
 1    pos     1.0 
 1    pos     2.0
 1    neg     3.0
 2    pos     4.0
 2    pos     5.0
 2    neg     6.0
 2    neg     7.0
我想按
id
和sum
amount
进行分组,但如果
memo
pos
的话,每组都是正数,
neg
是负数,例如当
groupby
1
时,总金额是0,因为
-1.0-2.0+3.0=0

如果我使用
df.groupby('id')['amount'].sum()
,它只考虑
id
amount
列,我想知道如何在这里也考虑
memo

所以结果会是

id    memo    amount    total_amount   
 1    pos     1.0       0.0
 1    pos     2.0       0.0
 1    neg     3.0       0.0
 2    pos     4.0       -4.0
 2    pos     5.0       -4.0
 2    neg     6.0       -4.0
 2    neg     7.0       -4.0

将操作分为两步,您可以通过

df['temp'] = np.where(df.memo == 'pos', df.amount, -df.amount)
df['total_amount'] = df.groupby('id').temp.transform(sum)

另一种有趣的映射和乘法方法,即

df['new'] = (df.set_index('id')['memo'].map({'pos':1,'neg':-1})*df['amount'].values)\
            .groupby(level=0).transform(sum).values
输出:

   id memo  amount  new
0   1  pos     1.0  0.0
1   1  pos     2.0  0.0
2   1  neg     3.0  0.0
3   2  pos     4.0 -4.0
4   2  pos     5.0 -4.0
5   2  neg     6.0 -4.0
6   2  neg     7.0 -4.0

我建议使用
numpy.where
在第一步
df[“temp”]=np.where(df[“memo”]==“neg”、-df[“amount”]、df[“amount”])
@user32185:Yep,它的性能似乎要好一点(可读性也好得多)。同时也比折衷方案(df.memo=='pos',1,-1)略胜一筹。@fuglede第一步在原文中是什么意思code@daiyue:很抱歉删除此选项,使您的评论不那么清晰。在原始代码中,
df.memo==“pos”
将是一个
系列,其值为
True
/
False
,取决于条件,
(df.memo==“pos”)*2
将分别与值
2
0
相同,并且
(df.memo==“pos”)*2-1
将是一个
系列
,其值为
1
-1
。将此元素与
df.值相乘将生成所需的操作。