如何高效地将Pandas数据框转换为JSON?

11

我开始使用 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中创建了一个数据框,并按创建日期聚合度量值'counter':

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

1个回答

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}}'

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接