Meu DataFrame é:
df = pd.DataFrame(
{
'a': [20, 9, 31, 40],
'b': [1, 10, 17, 30],
}
)
Resultado esperado: Criando coluna c
ename
a b c name
0 20 1 20 NaN
1 9 10 20 NaN
2 31 17 17 NaN
3 40 30 40 a
Passos:
a) c
é criado pordf['c'] = np.fmax(df['a'].shift().bfill(), df['b'])
b) para a última linha: df['c'] = df[['a', 'b']].max()
. Já para a última linha a > b
40 é escolhida.
c) Obtenha o nome do valor máximo entre a
ou b
para a última linha.
Minha tentativa:
df['c'] = np.fmax(df['a'].shift().bfill(), df['b'])
df.loc[df.index[-1], 'c'] = df.loc[df.index[-1], ['a', 'b']].max()
df.loc[df.index[-1], 'name'] = df.loc[df.index[-1], ['a', 'b']].idxmax()
É a maneira mais limpa/melhor abordagem?
Não sei o quanto isso representa uma melhoria, mas você pode combinar as duas últimas linhas de código em uma única linha se usar o
agg()
.Para criar uma cópia, poderíamos definir uma máscara que sinaliza a última linha e
assign()
as colunas “c” e “nome”.