在 Django 中使用 Pandas 转 JSON

Posted

技术标签:

【中文标题】在 Django 中使用 Pandas 转 JSON【英文标题】:Struggling with Pandas to JSON in Django 【发布时间】:2014-12-31 06:24:28 【问题描述】:

我有以下在 django 视图中创建的 pandas 数据框:

Date        Actual ticks
26-Sep-14   20
29-Sep-14   40
15-Oct-14   -10
20-Oct-14   5

使用pandas从csv文件中读取数据,然后转换成json对象,然后发送到django模板中:

df = pd.read_csv('article/DailyStats.csv', usecols=['Date', 'Actual ticks'])
df.to_json()
return render_to_response('article/test.html', 'df': df)

当我尝试在模板中使用 JSON 对象时,现在我遇到了问题:

<script type="text/javascript">
    $.getJSON( df , function(data)
        //do something
    )
 </script>

在我的 Chrome 浏览器控制台中,我收到错误:Uncaught SyntaxError: Unexpected Identifier

如果我在浏览器中查看 Sources,我会看到以下内容:

    <script type="text/javascript">
        $.getJSON(           Actual ticks
        Date                   
        26-Sep-14            20
        29-Sep-14            40
        15-Oct-14            -10
        20-Oct-14            5, function(data)
        )
    </script>

我想要的只是一个带有键列表(即:日期)和值(即:“实际刻度”)的 JSON。我猜这与列标题弄乱了一些东西有关。

最终我希望能够遍历 json 以显示日期和相应的值,但在此错误不再发生之前我不能这样做。

非常感谢您的建议。

更新:感谢@Anzel,他指出我没有将 JSON 对象分配给变量。我现在已经做到了,即: df_json = df.to_json()

但生成的 json 无效:

[
    [
        &quot;26-Sep-14&quot;,
        20
    ],
    [
        &quot;29-Sep-14&quot;,
        40
    ],
    [
        &quot;15-Oct-14&quot;,
        -10
    ],
    [
        &quot;20-Oct-14&quot;,
        5
    ]
]

知道如何让它创建一个有效的 JSON 吗?

【问题讨论】:

【参考方案1】:

问题是,您没有将 json 对象传递给 render_to_response,而只是将 df 作为 DataFrame 传递。

# this line, you're calling to_json, but haven't assigned to df itself
df.to_json()

# assign it to df_json (or df if you want), and pass it again to render_to_response
df_json = df.to_json()
return render_to_response('article/test.html', 'df': df_json)

并且在你的模板中,由于你已经传递了 json 对象,你不需要做任何 ajax 调用,只需解析 json 就可以了,像这样 (haven' t 测试过,但应该可以按预期工作),现在更新|safe 并用@RemcoGerlich 指出的引号括起来:

<script type="text/javascript">
    var json_data = JSON.parse(" df_json|safe "); // df if you assign df as the json
    // do whatever you want with json_data as usual
 </script>

【讨论】:

谢谢@Anzel。我的愚蠢错误。我已经做出改变了。但是生成的 json 无效。我已经更新了原始问题以显示 json 的样子。 @darkpool,我已经更新了我的答案,以涵盖 JavaScript 中您也需要更改的部分。 感谢您的帮助。 JSON 字符串现在有效。我不得不使用 df_json |安全 但它现在仍然有效。我用 JSONLint 检查了它。但由于某种原因,它现在给出了一个错误: Uncaught SyntaxError: Unexpected token o @darkpool,您希望 Date 作为您的密钥之一吗?记住DataFrame.to_json 将转换column -> index -> value,你可能忘记了set_index 在您的帮助和@RemcoGerlich 的建议下,它现在正在运行。谢谢!【参考方案2】:

至于您的第二个问题,Django 正在转义字符串,以便在 HTML 中安全使用(不能包含额外的 HTML 或 JavaScript 位)。

要告诉 Django 不要这样做,请使用 safe 模板过滤器。

另外,由于 this 需要成为 JavaScript 中的字符串文字,因此您需要在其周围加上引号:

var json_data = JSON.parse(" df_json|safe ");

【讨论】:

感谢您的帮助。感谢@Anzel 和你自己,它终于可以工作了。 @RemcoGerlich,与|safe的通话很棒

以上是关于在 Django 中使用 Pandas 转 JSON的主要内容,如果未能解决你的问题,请参考以下文章

在Django中构建一个数据驱动的仪表板以及pandas

Django:从 Pandas 到 Django Rest 框架的模型查询集

在javascript中循环遍历python-dictionary-turned-into-json

Django - 在模板中格式化/访问 Pandas.to_dict() 数据框

pandas

在 Django 模板中循环 Pandas 表