2014-09-10 29 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