将Pandas Dataframe转换为特定的json格式

时间:2014-12-01 00:01:54

标签: python json pandas

我一直在研究将pandas数据帧导出到json文件的不同方法,但我不知道如何包含其他字符串'常量'进入JSON。

目的是吐出一个可由chart.js读取的JSON文件。

示例中pandas数据帧的格式为:

df = pandas.DataFrame({
    "labels" : [1,2,3,4,5],
    "data" : [5,4,3,2,1]
})

JSON所需文件的格式为:

{
    labels: [1,2,3,4,5],
    datasets: [
        {
            label: "My First dataset",
            fillColor: "rgba(220,220,220,0.2)",
            strokeColor: "rgba(220,220,220,1)",
            pointColor: "rgba(220,220,220,1)",
            pointStrokeColor: "#fff",
            pointHighlightFill: "#fff",
            pointHighlightStroke: "rgba(220,220,220,1)",
            data: [5,4,3,2,1]
        }
    ]
}

我可以使用pandas的内置函数将pandas文件导出为JSON,但我不知道如何分离向量并添加上面看到的常量值。

1 个答案:

答案 0 :(得分:2)

我建议使用makojinja等模板库。这是一个包含JSON的快速mako文件,但引用了一个DataFrame参数df,当被要求呈现文档的最终形式(即实际数据)时,mako将传递给它。

这是文件"pandas_to_json.mako"

<%page args="df"/>

<%
"""Comments about this template file.
"""
# Python imports, helper function definitions, etc.
import pandas
%>

<%text> 
{
    labels: </%text> ${df.labels.values.tolist()} <%text>,
    datasets: [
        {
            label: "My First dataset",
            fillColor: "rgba(220,220,220,0.2)",
            strokeColor: "rgba(220,220,220,1)",
            pointColor: "rgba(220,220,220,1)",
            pointStrokeColor: "#fff",
            pointHighlightFill: "#fff",
            pointHighlightStroke: "rgba(220,220,220,1)",
            data: </%text> ${df.data.values.tolist()} <%text>
        }
    ]
}
</%text>

然后在.bel文件中调用你想要的任何内容(我称之为"pandas_to_json.py")你可以运行它(来自与.mako文件相同的目录):

import pandas
from mako.template import Template
mako_file_name = "pandas_to_json.mako"

df = pandas.DataFrame({
    "labels" : [1,2,3,4,5],
    "data" : [5,4,3,2,1]
})

t = Template(filename=mako_file_name)
print t.render(df)

并打印出来:

In [1]: %run pandas_to_json.py




{
    labels:  [1, 2, 3, 4, 5] ,
    datasets: [
        {
            label: "My First dataset",
            fillColor: "rgba(220,220,220,0.2)",
            strokeColor: "rgba(220,220,220,1)",
            pointColor: "rgba(220,220,220,1)",
            pointStrokeColor: "#fff",
            pointHighlightFill: "#fff",
            pointHighlightStroke: "rgba(220,220,220,1)",
            data:  [5, 4, 3, 2, 1] 
        }
    ]
}

为此,您需要安装mako。如果你使用conda包管理工具,那么这段代码可以帮我在Ubuntu 13上安装mako for Python 2.7:

conda install -c auto mako

但你也可以使用像pip这样的其他安装工具,或者只是按照mako的安装说明进行操作。

出于某种原因,更基本的conda install mako不起作用,声称在linux-64频道中找不到名为mako的包(尽管使用&#34; auto&#34 ;我的第一个命令中来自binstar的通道确实有效,表面上应该是等效的。)

我也听过关于jinja的好消息,它可能更方便,更容易安装/使用,或者出于其他原因更适合你。在选择使用之前,您应该检查它们。

这里的重点是控制模板渲染过程产生的内容,而不是受到大熊猫的支配。