Usando python / pandas, he usado la función melt () para transformar mis datos

Person  Score1  Score2  V1  V2
A   1   4   6   8
B   2   5   3   6
C   3   6   4   7

En la forma

 Person variable  value  V1  V2
0      A   Score1      1   6  8
1      B   Score1      2   3  6
2      C   Score1      3   4  7
3      A   Score2      4   6  8
4      B   Score2      5   3  6
5      C   Score2      6   4  7

Ahora quiero agregar otra columna V donde

V = V1 si variable = Puntaje1, de lo contrario = V2 si variable = Puntaje2

Resultando en:

  Person variable  value  V
0      A   Score1      1  6
1      B   Score1      2  3
2      C   Score1      3  4
3      A   Score2      4  8
4      B   Score2      5  6
5      C   Score2      6  7

Intenté usar var_name para nombrar el atributo variable pero no parece realmente definirlo, así que estoy luchando por usarlo para calcular los valores de la columna V, ¿alguna idea?

2
Alistair Downes 16 oct. 2018 a las 12:17

2 respuestas

La mejor respuesta

Utilizar np.where

import numpy as np

df['v'] = np.where(df['variable']== 'Score1', df['V1'], df['V2'])

# if you want to drop the columns
# df.drop(['V1','V2], axis=1, inplace=True)
0
AkshayNevrekar 16 oct. 2018 a las 09:38

Utilice wide_to_long:

df = (pd.wide_to_long(df.reset_index(),stubnames=['Score','V'], i=['index'], j='variable')
       .reset_index(level=0, drop=True)
       .reset_index()
       .assign(variable= lambda x: 'Score' + x['variable'].astype(str))
       )
print (df)
  variable Person  Score  V
0   Score1      A      1  6
1   Score1      B      2  3
2   Score1      C      3  4
3   Score2      A      4  8
4   Score2      B      5  6
5   Score2      C      6  7
2
jezrael 16 oct. 2018 a las 09:23