我一直在研究将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,但我不知道如何分离向量并添加上面看到的常量值。
答案 0 :(得分:2)
我建议使用mako或jinja等模板库。这是一个包含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的好消息,它可能更方便,更容易安装/使用,或者出于其他原因更适合你。在选择使用之前,您应该检查它们。
这里的重点是你控制模板渲染过程产生的内容,而不是受到大熊猫的支配。