Andrés Bustamante :
Tengo una trama de datos de este tipo pandas
col1 col2 col3
1 [blue] [in,out]
2 [green, green] [in]
3 [green] [in]
y necesito convertirlo en una trama de datos que mantienen la primera columna y distribuir todos los demás valores de las columnas como filas:
col1 value
1 blue
1 in
1 out
2 green
2 green
2 in
3 green
3 in
Jezreel:
El uso DataFrame.stack
de Series.explode
las listas de convertir, el último algunos datos de la limpieza con DataFrame.reset_index
:
df1 = (df.set_index('col1')
.stack()
.explode()
.reset_index(level=1, drop=True)
.reset_index(name='value'))
Alternativa con DataFrame.melt
y DataFrame.explode
:
df1 = (df.melt('col1')
.explode('value')
.sort_values('col1')[['col1','value']]
.reset_index(drop=True)
)
print (df1)
col1 value
0 1 blue
1 1 in
2 1 out
3 2 green
4 2 green
5 2 in
6 3 green
7 3 in
O solución lista por comprensión:
L = [(k, x) for k, v in df.set_index('col1').to_dict('index').items()
for k1, v1 in v.items()
for x in v1]
df1 = pd.DataFrame(L, columns=['col1','value'])
print (df1)
col1 value
0 1 blue
1 1 in
2 1 out
3 2 green
4 2 green
5 2 in
6 3 green
7 3 in