Python pandas - pd.melt一个带有datetime索引的数据帧导致NaN

时间:2015-06-22 15:38:13

标签: python datetime pandas

我有以下数据框(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]

Datepandas.tseries.index.DatetimeIndex。我使用pandas融化功能在@ami-tavory的帮助下对其进行了改造:

 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')

结果是:

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

由于某种原因,日期时间索引未被转移,并且列中填充了NaN。任何帮助或想法有什么问题?

3 个答案:

答案 0 :(得分:4)

假设Date是您的DataFrame的索引,您可以在融化的DataFrame中获取日期列,如下所示:

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

答案 1 :(得分:3)

以下是使用.stack()解决问题的一种方法。

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]

答案 2 :(得分:3)

仍在使用.melt()的一个可能更简单的解决方案是首先将日期索引拉出到.reset_index()的列中:

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()获得了相同的结果,但如果你想要所有额外的优点,这种方式会更灵活。