Meus dados de entrada:
df=pd.DataFrame({'ID':['A','B','C','D'],
'Group':['group1','group1','group2','group2'],
'Flag_1':[1,0,0,1],
'Flag_2':[1,1,0,1],
'Value':[30,40,60,70]
})
Estou tentando somar "Valor" por grupo quando o sinalizador é igual a 1. Minha saída esperada é:
df_value_group=pd.DataFrame({
'Flag_1 Sum':[1,1],
'Flag_2 Sum':[2,1],
'Value_1 Sum':[30,70],
'Value_2 Sum':[70,70]},
index=['group1','group2'])
Eu tentei isso, mas ele me gera um erro AssertionError principalmente devido às duas últimas funções lambda.
df.groupby('Group').agg(
**{ 'Flag_1 Sum': ('Flag_1','sum'),
'Flag_2 Sum': ('Flag_2','sum'),
'Value_1 Sum': ('Flag_1', lambda col: df.loc[col.eq(1), 'Value'].sum()),
'Value_2 Sum': ('Flag_2', lambda col: df.loc[col.eq(1), 'Value'].sum())
})
Uma forma mais eficiente é calcular os booleanos antes de agrupar:
Para uma abordagem genérica, você pode usar uma
groupby.agg
agregação personalizada (nomeada):NB.
lambda x: val[x.index][x==1].sum()
poderia ser substituído porlambda x: val.where(x==1).sum()
.Ou remodelar com
melt
e agregar compivot_table
:Saída:
Você quer agregar mais de
'Value'
, não'Flag_X'
Crie uma função lambda com a função where
fora:
Se houver muitas colunas que correspondem a
Flag
, ou se a linha inteira for longa e a eficiência for importante, é melhor criar um groupby para cada uma e então usar a função concat .mesmo resultado