如何有效地从 Pandas 数据框移动到 JSON
Posted
技术标签:
【中文标题】如何有效地从 Pandas 数据框移动到 JSON【英文标题】:How can I efficiently move from a Pandas dataframe to JSON 【发布时间】:2013-10-13 10:06:47 【问题描述】:我已经开始使用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; ));
我对整体上更好的工作流程的建议持开放态度,因为这是我需要经常做的事情,但我不确定处理D3
和pandas
之间连接的最佳方式。 (我查看了几个直接结合了python
和D3
的包,但这不是我想要的,因为它们似乎专注于静态图表生成而不是制作 svg)
【问题讨论】:
【参考方案1】:使用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'
【讨论】:
以上是关于如何有效地从 Pandas 数据框移动到 JSON的主要内容,如果未能解决你的问题,请参考以下文章
如何将 pandas 数据框导出为 json 并保留原始日期时间格式?
如何让 pandas.read_json 将此 API 返回识别为有效的 .json?
如何在 pySpark 中有效地从字符串数据框中替换多个正则表达式模式的所有实例?