2014-09-29 17 views
0

我有一個數據庫,其中包含來自傳感器的時間序列數據。該圖形庫,我想在前端使用需要數據每個傳感器,而不是在我的數據集的垂直格式重新塑造成一列:無法在pivoted pandas數據框上調用to_json:返回「ValueError:標籤數組大小與相應的數據形狀不匹配」

>>> for d in dataset: print d             
... 
[datetime.datetime(2014, 9, 26, 0, 56, 0, 598000), u'motion', 0.0] 
[datetime.datetime(2014, 9, 26, 0, 56, 7, 698000), u'motion', 1.0] 
[datetime.datetime(2014, 9, 26, 0, 58, 20, 298000), u'motion', 0.0] 
[datetime.datetime(2014, 9, 26, 2, 21, 27, 893000), u'door', 0.0] 
[datetime.datetime(2014, 9, 26, 2, 21, 37, 793000), u'door', 1.0] 
[datetime.datetime(2014, 9, 26, 2, 21, 53, 893000), u'door', 0.0] 

與計算器一些幫助和大熊貓文檔(感謝!)我想出如何透視數據:

>>> import pandas as pd 
>>> pd.__version__ 
'0.14.1' 
>>> 
>>> df = pd.DataFrame(dataset, columns=['tstamp', 'tag', 'value'])    
>>> dfp = df.pivot('tstamp', 'tag') 
>>> dfp 
           value 
tag       door motion 
tstamp 
2014-09-26 00:56:00.598000   NaN   0 
2014-09-26 00:56:07.698000   NaN   1 
2014-09-26 00:58:20.298000   NaN   0 
2014-09-26 02:21:27.893000   0   NaN 
2014-09-26 02:21:37.793000   1   NaN 
2014-09-26 02:21:53.893000   0   NaN 
>>> 

現在我被困試圖輸出JSON數據:

>>> dfp.to_json() 
Traceback (most recent call last): 
    File "<console>", line 1, in <module> 
    File "/var/www/environment/default/local/lib/python2.7/site-packages/pandas/core/generic.py", line 853, in to_json 
    default_handler=default_handler) 
    File "/var/www/environment/default/local/lib/python2.7/site-packages/pandas/io/json.py", line 34, in to_json 
    date_unit=date_unit, default_handler=default_handler).write() 
    File "/var/www/environment/default/local/lib/python2.7/site-packages/pandas/io/json.py", line 77, in write 
    default_handler=self.default_handler) 
ValueError: Label array sizes do not match corresponding data shape 

我是新來的大熊貓讓我顧因爲我需要修理我的「標籤陣列」。我該怎麼辦?我可以看到

>>> dfp.keys() 
MultiIndex(levels=[[u'value'], [u'door', u'motion']], 
      labels=[[0, 0], [0, 1]], 
      names=[None, u'tag']) 

但我不知道下一步該怎麼做。

回答

2

pivot正在製作一個DataFrame,其列具有MultiIndex。由於頂層,value,是對所有列相同,你可以簡單地拖放:

dfp.columns = dfp.columns.droplevel(0) 

,然後調用to_json作品:

In [20]: dfp.to_json() 
Out[20]: '{"door":{"1411692960598":null,"1411692967698":null,"1411693100298":null,"1411698087893":0.0,"1411698097793":1.0,"1411698113893":0.0},"motion":{"1411692960598":0.0,"1411692967698":1.0,"1411693100298":0.0,"1411698087893":null,"1411698097793":null,"1411698113893":null}}' 

或者,更好的,指定values立即撥打電話pivot

In [26]: dfp = df.pivot(index='tstamp', columns='tag', values='value'); dfp 
Out[26]: 
tag       door motion 
tstamp         
2014-09-26 00:56:00.598000 NaN  0 
2014-09-26 00:56:07.698000 NaN  1 
2014-09-26 00:58:20.298000 NaN  0 
2014-09-26 02:21:27.893000  0  NaN 
2014-09-26 02:21:37.793000  1  NaN 
2014-09-26 02:21:53.893000  0  NaN 

現在由於列索引是平坦的,因此致電to_json即可使用。

+0

這工作!我發現爲了保持所需的'tstamp'方向,我可以使用'dfp.to_json(orient ='index')'。我想知道是否沒有辦法直接使用to_json而不是pivot? – Chris 2014-09-29 17:35:02

+0

感謝您的額外建議。更好。 – Chris 2014-09-29 17:39:38

+0

數據透視表將列值更改爲列標籤。 'orient'選項(分割,記錄,索引,列,值)都沒有,所以我認爲你不需要調用pivot。 – unutbu 2014-09-29 17:40:10

相關問題