2017-03-19 84 views
2

假設我有一個時間序列像在時間序列數據轉換行

In [41]: df = pd.DataFrame(dict(names=list('abcaabcabbcc'), vals=np.random.randint(0, 10, 12)), index 
    ...: =pd.date_range('2017-03-01', periods=12)) 

In [42]: df 
Out[42]: 
      names vals 
2017-03-01  a  2 
2017-03-02  b  9 
2017-03-03  c  6 
2017-03-04  a  6 
2017-03-05  a  5 
2017-03-06  b  2 
2017-03-07  c  3 
2017-03-08  a  1 
2017-03-09  b  1 
2017-03-10  b  1 
2017-03-11  c  1 
2017-03-12  c  0 

我怎樣才能names行轉換成列標題,其下對應的vals是誰?例如

   a  b  c 
2017-03-01  2 nan nan 
2017-03-02 nan  9 nan 
... 

我一直pd.melt玩弄以及試圖將names添加到索引,然後重置索引,使他們成爲列不知怎麼的,但是我很堅持。

回答

2

您可以使用:

print (pd.pivot(index=df.index, columns=df['names'], values=df['vals'])) 

或者:

print (df.set_index('names', append=True)['vals'].unstack()) 
names   a b c 
2017-03-01 4.0 NaN NaN 
2017-03-02 NaN 0.0 NaN 
2017-03-03 NaN NaN 3.0 
2017-03-04 8.0 NaN NaN 
2017-03-05 0.0 NaN NaN 
2017-03-06 NaN 0.0 NaN 
2017-03-07 NaN NaN 9.0 
2017-03-08 6.0 NaN NaN 
2017-03-09 NaN 6.0 NaN 
2017-03-10 NaN 0.0 NaN 
2017-03-11 NaN NaN 3.0 
2017-03-12 NaN NaN 9.0 

print (df.reset_index().pivot_table(index='index', columns='names', values='vals')) 
+0

稀釋使用數據透視表。謝謝! –

1

你也可以使用拆散():

In [12]: df.set_index('names', append=True).unstack('names') 
Out[12]: 
      vals 
names   a b c 
2017-03-01 1.0 NaN NaN 
2017-03-02 NaN 4.0 NaN 
2017-03-03 NaN NaN 5.0 
2017-03-04 8.0 NaN NaN 
2017-03-05 8.0 NaN NaN 
2017-03-06 NaN 5.0 NaN 
2017-03-07 NaN NaN 7.0 
2017-03-08 5.0 NaN NaN 
2017-03-09 NaN 7.0 NaN 
2017-03-10 NaN 4.0 NaN 
2017-03-11 NaN NaN 3.0 
2017-03-12 NaN NaN 4.0 
+0

檢查我的解決方案,已經有解決方案;) – jezrael

+0

@jezrael,你太快:) – MaxU

+0

但雙numpy。今天是更快;) – jezrael