Eu tenho um dataframe como este:
>>> df
TYPE A B C D
0 IN 550 350 600 360
1 OUT 340 270 420 190
Quero remodelá-lo para este formato:
AIN AOUT BIN BOUT CIN COUT DIN DOUT
550 340 350 270 600 420 360 190
Então eu uso esses códigos para fazer isso:
ds = df.melt().T.iloc[1:,2:]
ds.columns = ['AIN','AOUT','BIN','BOUT','CIN','COUT','DIN','DOUT']
>>> ds
AIN AOUT BIN BOUT CIN COUT DIN DOUT
value 550 340 350 270 600 420 360 190
Funciona, mas parece estúpido, o nome das colunas foi inserido manualmente, gostaria de saber se há uma maneira melhor, mais pythonic, de fazer isso. Alguma ideia?
PS: o "valor" no dataframe de saída é insignificante.
Uma possível solução, cujos passos são:
O
drop
método remove aTYPE
coluna do dataframedf
, resultando em um novo dataframe.O
values
método extrai a matriz subjacentenumpy
do dataframe modificado.O
reshape
método remodela a matriz em uma matriz 2D com uma linha e o mesmo número de colunas do dataframe original.O
columns
parâmetro é definido como uma lista de strings geradas por uma compreensão de lista. Cada string é uma concatenação de um nome de colunadf
e um valor daTYPE
coluna.Por fim, um novo dataframe é criado com o array remodelado e os novos nomes das colunas.
Saída:
Código
Aplique
join
a função (python) commap
a função (pandas) ao Multi-index.fora:
Escolhi
pivot
a função porque ela é inconveniente ao criar um dataframe de 1 linha, pois ambosmelt
estack
requeremT
. (Se eu estivesse criando uma série ou um dataframe de 1 coluna, eu teria escolhidomelt
oustack
.)Código de exemplo
df.columns[1:]
percorrer as colunas A, B, C, D, excluindo aTYPE
coluna.O loop
loc
filtra as linhasTYPE
e então extrai os valores correspondentes para cada coluna.E então novas colunas são construídas combinando o nome da variável (por exemplo, A, B, etc.) com os sufixos IN e OUT.
Saída