Python 使用groupby选择行,对列求和,并使用所有groupby元素的和创建新列
我有这个数据框:Python 使用groupby选择行,对列求和,并使用所有groupby元素的和创建新列,python,pandas,pandas-groupby,Python,Pandas,Pandas Groupby,我有这个数据框: nome code tipo score Alexandre AAA Frads 4000 Alexandre AAA Memb 10000 Alexandre AAA Memb 20000 Bruno BBB Dans 10000 Bruno BBB Grap 4000 我需要创建一个新列,将具有相同nome和code的行相加,其中tipo='Memb',如下所示: 我用transform
nome code tipo score
Alexandre AAA Frads 4000
Alexandre AAA Memb 10000
Alexandre AAA Memb 20000
Bruno BBB Dans 10000
Bruno BBB Grap 4000
我需要创建一个新列,将具有相同nome
和code
的行相加,其中tipo='Memb'
,如下所示:
我用transform('sum')
尝试了groupby
,但是得到了错误的结果
df['score'].loc[df['tipo'] == "Memb"]=df[['nome','code','score']].groupby(['nome','code'])['score'].transform('sum')
我错过了什么
import numpy as np
df['Memb_sum']=df.groupby(['nome','code','tipo'])['score'].transform('sum')
df['Memb_sum']=np.where(df['tipo'] != 'Memb', 0, df['Memb_sum'])
df['Memb_sum']=df.groupby(['nome','code'])['Memb_sum'].transform('max')
您可以先执行分组,然后再筛选出值
输出:
nome code tipo score Memb_sum
0 Alexandre AAA Frads 4000 30000
1 Alexandre AAA Memb 10000 30000
2 Alexandre AAA Memb 20000 30000
3 Bruno BBB Dans 10000 0
4 Bruno BBB Grap 4000 0
nome code tipo score Memb_sum
0 Alexandre AAA Frads 4000 30000
1 Alexandre AAA Memb 10000 30000
2 Alexandre AAA Memb 20000 30000
3 Bruno BBB Dans 10000 0
4 Bruno BBB Grap 4000 0
您可以先执行分组,然后再筛选出值
输出:
nome code tipo score Memb_sum
0 Alexandre AAA Frads 4000 30000
1 Alexandre AAA Memb 10000 30000
2 Alexandre AAA Memb 20000 30000
3 Bruno BBB Dans 10000 0
4 Bruno BBB Grap 4000 0
nome code tipo score Memb_sum
0 Alexandre AAA Frads 4000 30000
1 Alexandre AAA Memb 10000 30000
2 Alexandre AAA Memb 20000 30000
3 Bruno BBB Dans 10000 0
4 Bruno BBB Grap 4000 0
你可以试试这个
将'tipo'
设置为索引使用,然后使用类似的nome
和code
对值进行分组,并使用等于Memb
df['Memb_sum'] = (df.set_index('tipo').
groupby(['nome','code']).score.
transform(lambda x:x.loc[x.index=='Memb'].sum()).
values)
输出:
nome code tipo score Memb_sum
0 Alexandre AAA Frads 4000 30000
1 Alexandre AAA Memb 10000 30000
2 Alexandre AAA Memb 20000 30000
3 Bruno BBB Dans 10000 0
4 Bruno BBB Grap 4000 0
nome code tipo score Memb_sum
0 Alexandre AAA Frads 4000 30000
1 Alexandre AAA Memb 10000 30000
2 Alexandre AAA Memb 20000 30000
3 Bruno BBB Dans 10000 0
4 Bruno BBB Grap 4000 0
你可以试试这个
将'tipo'
设置为索引使用,然后使用类似的nome
和code
对值进行分组,并使用等于Memb
df['Memb_sum'] = (df.set_index('tipo').
groupby(['nome','code']).score.
transform(lambda x:x.loc[x.index=='Memb'].sum()).
values)
输出:
nome code tipo score Memb_sum
0 Alexandre AAA Frads 4000 30000
1 Alexandre AAA Memb 10000 30000
2 Alexandre AAA Memb 20000 30000
3 Bruno BBB Dans 10000 0
4 Bruno BBB Grap 4000 0
nome code tipo score Memb_sum
0 Alexandre AAA Frads 4000 30000
1 Alexandre AAA Memb 10000 30000
2 Alexandre AAA Memb 20000 30000
3 Bruno BBB Dans 10000 0
4 Bruno BBB Grap 4000 0
为了提高性能,可以将
得分
替换为0
值,然后与总和
一起使用:
df['Memb_sum'] = (df.assign(score=df['score'].mask(df['tipo'] != 'Memb', 0))
.groupby(['nome','code'])['score']
.transform('sum'))
print (df)
nome code tipo score Memb_sum
0 Alexandre AAA Frads 4000 30000
1 Alexandre AAA Memb 10000 30000
2 Alexandre AAA Memb 20000 30000
3 Bruno BBB Dans 10000 0
4 Bruno BBB Grap 4000 0
详细信息:
print (df.assign(score=df['score'].mask(df['tipo'] != 'Memb', 0)))
nome code tipo score
0 Alexandre AAA Frads 0
1 Alexandre AAA Memb 10000
2 Alexandre AAA Memb 20000
3 Bruno BBB Dans 0
4 Bruno BBB Grap 0
为了提高性能,可以将
得分
替换为0
值,然后与总和
一起使用:
df['Memb_sum'] = (df.assign(score=df['score'].mask(df['tipo'] != 'Memb', 0))
.groupby(['nome','code'])['score']
.transform('sum'))
print (df)
nome code tipo score Memb_sum
0 Alexandre AAA Frads 4000 30000
1 Alexandre AAA Memb 10000 30000
2 Alexandre AAA Memb 20000 30000
3 Bruno BBB Dans 10000 0
4 Bruno BBB Grap 4000 0
详细信息:
print (df.assign(score=df['score'].mask(df['tipo'] != 'Memb', 0)))
nome code tipo score
0 Alexandre AAA Frads 0
1 Alexandre AAA Memb 10000
2 Alexandre AAA Memb 20000
3 Bruno BBB Dans 0
4 Bruno BBB Grap 0
请包括数据帧,我可以复制和粘贴,我可以工作的解决方案现在,但我不想键入所有的东西。。。检查。哦,很抱歉,添加了一个Google Sheets链接,它解决了问题吗?问题本身更好,但它可以避免输入,谢谢。我已经发布了一个答案,请检查它,如果它解决了你的问题,请包括我可以复制和粘贴的数据框,我现在就可以找到解决方案,但我不想把所有内容都输入。。。检查。哦,对此很抱歉,添加了一个Google Sheets链接,它解决了吗?问题本身更好,但它可以避免输入,谢谢。我已经发布了一个答案,请检查它是否解决了您的问题顺便说一句,如果有一个版本的
transform
通过了整个小组,那就好了,类似于apply
。顺便说一句,如果有一个版本的transform
通过了整个小组,这将是一件好事,类似于apply
。