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
和sumamount
进行分组,但如果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.值相乘将生成所需的操作。