Python pandas – pd.melt un dataframe con resultados de índice de fecha y hora en NaN

Tengo el siguiente dataframe (sim_2005):

Date ELEM1 ELEM2 ... ELEM1133 2005-01-01 0.021 2.455 ... 345.2 2005-01-02 0.321 2.331 ... 355.1 ... ... ... ... ... 2005-12-31 0.789 3.456 ... 459.9 [365 rows x 1133 columns] 

siendo Date un pandas.tseries.index.DatetimeIndex . Lo transformé con la ayuda de @ ami-tavory usando la función de fusión de pandas:

  sim_2005_melted = pd.melt(sim_2005, id_vars=sim_2005.index.name, value_vars=list(sim_2005.columns.values), var_name='ELEM', value_name='Q_sim').sort(columns='Date') 

Lo que resulta en:

 ID Date ELEM Q_sim 1 NaN ELEM1 0.021 2 NaN ELEM1 0.321 ... 366 NaN ELEM2 2.455 367 NaN ELEM2 2.331 ... 402983 NaN ELEM1133 345.2 402984 NaN ELEM1133 355.1 

Por alguna razón, el índice de fecha y hora no se transporta y la columna se llena con NaN. ¿Alguna ayuda o idea que está mal?

Aquí hay una forma de usar .stack() para resolver su pregunta.

 import pandas as pd import numpy as np # try to simulate your data columns = ['ELEM' + str(x) for x in np.arange(1, 1134, 1)] sim_2005 = pd.DataFrame(np.random.randn(365, 1133), index=pd.date_range('2005-01-01', periods=365, freq='D'), columns=columns) processed_sim_2005 = sim_2005.stack().reset_index() processed_sim_2005.columns = ['Date', 'ELEM', 'Q_sim'] Out[82]: Date ELEM Q_sim 0 2005-01-01 ELEM1 0.6221 1 2005-01-01 ELEM2 0.1862 2 2005-01-01 ELEM3 -1.0736 3 2005-01-01 ELEM4 -0.9756 4 2005-01-01 ELEM5 0.8397 ... ... ... ... 413540 2005-12-31 ELEM1129 0.0345 413541 2005-12-31 ELEM1130 0.5522 413542 2005-12-31 ELEM1131 -0.6900 413543 2005-12-31 ELEM1132 -0.2269 413544 2005-12-31 ELEM1133 0.1243 [413545 rows x 3 columns] 

Suponiendo que Date es el índice de su DataFrame, puede obtener una columna de fecha en su DataFrame fundido de la siguiente manera:

 sim_2005_melted['Date'] = pd.concat([sim_2005.reset_index().Date for _ in range(sim_2005.shape[1])], ignore_index=True).values 

Una solución posiblemente más simple que todavía usa .melt() es extraer su índice de fecha en una columna con .reset_index() primero:

sim_2005_melted = pd.melt(sim_2005.reset_index(), id_vars=sim_2005.index.name, value_vars=list(sim_2005.columns.values), var_name='ELEM', value_name='Q_sim')

.stack() el mismo resultado con .stack() pero de esta manera es un poco más flexible si quieres toda la bondad adicional de Melty.