2014-09-10 54 views
2

我有一些数据,是在周末缺失值,公共假期等最佳途径UNPIVOT一个熊猫数据帧

datadate | id | Value 
----------------------- 
1999-12-31 | 01 | 1.0 
1999-12-31 | 02 | 0.5 
1999-12-31 | 03 | 3.2 
2000-01-04 | 01 | 1.0 
2000-01-04 | 02 | 0.7 
2000-01-04 | 03 | 3.2 

而且我要的值复制下来在数据缺少其中的日期。所以,我已经调整了框架,重新编制索引,并将值复制下来。

datadate | 01 | 02 | 03 
---------------------------- 
1999-12-31 | 1.0 | 0.5 | 3.2 
2000-01-01 | 1.0 | 0.5 | 3.2 
2000-01-02 | 1.0 | 0.5 | 3.2 
2000-01-03 | 1.0 | 0.5 | 3.2 
2000-01-04 | 1.0 | 0.7 | 3.2 

现在我想返回数据到它的原始形式。我尝试过使用pd.melt()df.unstack(),但是我得到的列数多于我想要的,并且从结果构建新的数据帧需要很长时间。

有没有更好的方法来反转数据?

+0

“更多的列比我想要的” - 这是什么意思?你应该为'id'中的每个唯一值设置一个列。你究竟想要什么? – 2014-09-10 16:45:40

回答

3

有一个pandas.pivot_table函数,如果您将datadateid定义为索引,则可以执行unstack数据帧。

这会是:

from io import StringIO 
import pandas 

datatable = StringIO("""\ 
datadate | id | Value 
1999-12-31 | 01 | 1.0 
1999-12-31 | 02 | 0.5 
1999-12-31 | 03 | 3.2 
2000-01-04 | 01 | 1.0 
2000-01-04 | 02 | 0.7 
2000-01-04 | 03 | 3.2""") 

fullindex = pandas.DatetimeIndex(freq='1D', start='1999-12-31', end='2000-01-06') 
df = (
    pandas.read_table(datatable, sep='\s+\|\s+', parse_dates=['datadate']) 
      .set_index(['datadate', 'id']) 
      .unstack(level='id') 
      .reindex(fullindex) 
      .fillna(method='ffill') 
      .stack() 
      .reset_index() 
      .rename(columns={'level_0': 'date'}) 
) 

print(df) 

这给了我:

  date id Value 
0 1999-12-31 1 1.0 
1 1999-12-31 2 0.5 
2 1999-12-31 3 3.2 
3 2000-01-01 1 1.0 
4 2000-01-01 2 0.5 
5 2000-01-01 3 3.2 
6 2000-01-02 1 1.0 
7 2000-01-02 2 0.5 
8 2000-01-02 3 3.2 
9 2000-01-03 1 1.0 
10 2000-01-03 2 0.5 
11 2000-01-03 3 3.2 
12 2000-01-04 1 1.0 
13 2000-01-04 2 0.7 
14 2000-01-04 3 3.2 
15 2000-01-05 1 1.0 
16 2000-01-05 2 0.7 
17 2000-01-05 3 3.2 
18 2000-01-06 1 1.0 
19 2000-01-06 2 0.7 
20 2000-01-06 3 3.2 

(我喜欢链接)

+0

我认为OP是想以另一种方式? pv到df。我认为你可以通过融化来做到这一点,但看起来很凌乱! – 2014-09-10 18:37:04

+0

我认为堆积,重新索引和填充是需要发生的事情。我错过了填补缺失日期的部分。我想我们只是太小了一个不喜欢链接的示例数据集 – 2014-09-10 18:38:54

+0

! FWIW我更喜欢在每一行使用括号而不是\(我讨厌那些!:p)。 – 2014-09-10 19:50:22