Remodelando un dataframe de pandas repitiendo filas

Soy nuevo en Python especialmente Pandas. Tengo un dataframe como

----------------------------------------------------- Id Name Salary desc1 desc2 desc3 ----------------------------------------------------- 1 ABC1 2000 x1 y1 z1 ----------------------------------------------------- 2 ABC2 5000 x2 y1 z2 ----------------------------------------------------- 

Quiero transformarlo de esta manera.

 ----------------------------------------- ID Name Salary Variable ----------------------------------------- 1 ABC1 2000 x1 ----------------------------------------- 1 ABC1 2000 y1 ----------------------------------------- 1 ABC1 2000 z1 ----------------------------------------- 2 ABC2 5000 x2 ----------------------------------------- 2 ABC2 5000 y2 ----------------------------------------- 2 ABC2 5000 z2 ----------------------------------------- 

Por favor ayuda. Gracias por adelantado.

Necesitas set_index + stack :

 df = df.set_index(['Id','Name','Salary']) .stack() .reset_index(level=3, drop=True) .reset_index(name='Variable') print (df) Id Name Salary Variable 0 1 ABC1 2000 x1 1 1 ABC1 2000 y1 2 1 ABC1 2000 z1 3 2 ABC2 5000 x2 4 2 ABC2 5000 y1 5 2 ABC2 5000 z2 

Si no es necesario clasificar las 3 primeras columnas:

Utilizar melt

 df = df.melt(['Id','Name','Salary'], value_name='Variable').drop('variable', axis=1) print (df) Id Name Salary Variable 0 1 ABC1 2000 x1 1 2 ABC2 5000 x2 2 1 ABC1 2000 y1 3 2 ABC2 5000 y1 4 1 ABC1 2000 z1 5 2 ABC2 5000 z2 

lreshape ahora no está documentado, pero es posible que en el futuro se elimine ( enlace github ).

 df = pd.lreshape(df, {'Variable':['desc1','desc2','desc3']}) print (df) Id Name Salary Variable 0 1 ABC1 2000 x1 1 2 ABC2 5000 x2 2 1 ABC1 2000 y1 3 2 ABC2 5000 y1 4 1 ABC1 2000 z1 5 2 ABC2 5000 z2