У меня есть этот фрейм данных:

nome       code  tipo   score
Alexandre   AAA  Frads  4000
Alexandre   AAA  Memb   10000
Alexandre   AAA  Memb   20000
Bruno       BBB  Dans   10000
Bruno       BBB  Grap   4000

Значения, доступные в этих листах Google

Мне нужно создать новый столбец, суммирующий строки с одинаковыми nome и code, где tipo = 'Memb', таким образом, чтобы это выглядело так:

enter image description here

Я пытался groupby с transform('sum'), однако это дает мне неверный результат.

df['score'].loc[df['tipo'] == "Memb"]=df[['nome','code','score']].groupby(['nome','code'])['score'].transform('sum')

enter image description here

Чего мне не хватает?

1
aabujamra 31 Май 2020 в 14:40

3 ответа

Лучший ответ

Для повышения производительности возможно заменить значения score на 0 на Series.mask, а затем используйте GroupBy.transform с sum:

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   
3
jezrael 31 Май 2020 в 12:32

Вы можете попробовать это.

Установите 'tipo' в качестве индекса, используя { {X1}}, затем сгруппируйте значения с похожими nome и code, используя df.groupby и используйте df.transform и сумма этих индексов, равных 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
3
Ch3steR 31 Май 2020 в 12:41
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
1
EXODIA 31 Май 2020 в 12:16