Tenho um dataframe que contém ID de usuário, código e valor.
user code value
0001 P 10
0001 P 20
0001 N 10
0002 N 40
0002 N 30
0003 P 10
Estou tentando adicionar uma nova coluna que agrupa por ID de usuário, filtra por código = P
e soma o valor. No entanto, quero que esse valor seja aplicado a cada linha.
Então, para o exemplo acima, a saída que estou procurando seria:
user code value Sum_of_P
0001 P 10 30
0001 P 20 30
0001 N 10 30
0002 N 40 0
0002 N 30 0
0003 P 10 10
Tentei fazer isso df['Sum_of_P'] = df.loc[df['code'] == 'P', 'value'].groupby(df['user']).transform('sum')
, mas isso se aplica apenas às linhas com código = P
. Existe uma maneira de fazer com que isso se aplique a todas as linhas?
Use uma máscara e
where
em vez deloc
:Variante com NaNs como valores mascarados:
Se você quiser usar,
loc
você deve agregar em vez detransform
, entãomap
os valores do grupo:Saída:
Uma abordagem ligeiramente diferente
Filtre o dataframe onde
code == 'P'
e então agrupe por usuário para somar o valor e criar um novo dataframeEm seguida, mescle-o de volta ao df original
Saída