我怎样才能有效地从Pandas数据帧转移到JSON

时间:2013-10-06 22:12:56

标签: javascript python json d3.js pandas

我已经开始使用pandas按日期进行一些汇总。我的目标是计算在特定日期发生的所有测量实例,然后在D3中表示。为了说明我的工作流程,我有一个查询集(来自Django),如下所示:

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对象最有用。使用Pandas to_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)

1 个答案:

答案 0 :(得分:23)

将日期索引转换回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}}'