2013-10-06 77 views
11

我已經開始使用pandas按日期進行聚合。我的目標是統計某一天發生的所有測量實例,然後在D3中表示這一點。爲了說明我的工作流程,我有一個查詢集(從Django),看起來像這樣:如何從熊貓數據框有效地移動到JSON

queryset = [{'created':"05-16-13", 'counter':1, 'id':13}, {'created':"05-16-13", 'counter':1, 'id':34}, {'created':"05-17-13", 'counter':1, 'id':12}, {'created':"05-16-13", 'counter':1, 'id':7}, {'created':"05-18-13", 'counter':1, 'id':6}] 

我做一個數據幀中pandas並創造了一天聚集措施「計數器」:

import pandas as pd 
queryset_df = pd.DataFrame.from_records(queryset).set_index('id') 
aggregated_df = queryset_df.groupby('created').sum() 

這給了我這樣一個數據幀:

  counter 
created   
05-16-13  3 
05-17-13  1 
05-18-13  1 

由於我使用D3我想到一個JSON對象會爲t他最有用。使用Pandasto_json()功能將我的數據幀是這樣的:

aggregated_df.to_json() 

給我下面的JSON對象

{"counter":{"05-16-13":3,"05-17-13":1,"05-18-13":1}} 

這不正是我想要的,我想能夠同時訪問日期和測量。有沒有一種方法可以導出數據,以便我最終得到類似的結果?

data = {"c1":{"date":"05-16-13", "counter":3},"c2":{"date":"05-17-13", "counter":1}, "c3":{"date":"05-18-13", "counter":1}} 

我想,如果我能在Python側面結構此不同,它會減少數據的格式,因爲我計劃加載數據做這樣的事情,我需要在JS側做量:

x.domain(d3.extent(data, function(d) { return d.date; })); 
    y.domain(d3.extent(data, function(d) { return d.counter; })); 

我更好地工作流程的建議非常開放的整體,因爲這是我需要做的頻繁,但我不能確定的處理D3pandas之間的連接的最佳方式。 (我看了一下這兩個pythonD3直接將幾個包,但是這不是我找的,因爲他們似乎把重點放在靜態圖表生成的東西,而不是做一個SVG)

回答

22

將您的日期索引回一個帶有reset_index的簡單數據列,然後使用orient='index'屬性生成您的json對象:

In [11]: aggregated_df.reset_index().to_json(orient='index') 
Out[11]: '{"0":{"created":"05-16-13","counter":3},"1":{"created":"05-17-13","counter":1},"2":{"created":"05-18-13","counter":1}}'