我有以下数据框(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]
Date
为pandas.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。任何帮助或想法有什么问题?
答案 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()
获得了相同的结果,但如果你想要所有额外的优点,这种方式会更灵活。