【发布时间】:2014-12-02 08:54:15
【问题描述】:
我一直在我的服务器中使用 pandas DataFrame 对象,将它们转换为 CSV 以传输到浏览器,在浏览器中使用 d3 绘制表格值。虽然 CSV 是文件,但我真的需要的不仅仅是 2D 数据表。如果不出意外,我想返回一些关于数据的元数据。
所以我开始使用 JSON 来解决问题,以为我可以用一些元信息和我的 DataFrame 构建一个字典。例如,就像一个荒谬的简单示例:
>>> z = numpy.zeros(10)
>>> df = pandas.DataFrame(z)
>>> df
0
0 0
1 0
2 0
3 0
4 0
5 0
6 0
7 0
8 0
9 0
>>> result = {
... "name": "Simple Example",
... "data": df,
... }
毫不奇怪,这不能使用 json 模块直接序列化。我找到了 jsonext 模块并尝试了它。它“有效”,但产生的结果不完整:
>>> jsonext.dumps(result)
'{"data": ["0"], "name": "Simple Example"}'
查看 DataFrame 本身为这类事情提供的方法,我发现了 to_dict() 和 to_json()。前者产生字典的字典:
>>> df.to_dict()
{0: {0: 0.0, 1: 0.0, 2: 0.0, 3: 0.0, 4: 0.0, 5: 0.0, 6: 0.0, 7: 0.0, 8: 0.0, 9: 0.0}}
但正如您所见,它们无法序列化为 JSON,因为键不是字符串。
df.to_json() 看起来它可能会起作用,尽管我最终会在另一个 JSON 字符串中嵌入一个 JSON 字符串。像这样的:
json.dumps({"name": "简单示例", "data": df.to_json()}) '{"数据": "{\"0\":{\"0\":0.0,\"1\":0.0,\"2\":0.0,\"3\":0.0,\"4 \":0.0,\"5\":0.0,\"6\":0.0,\"7\":0.0,\"8\":0.0,\"9\":0.0}}", "名称": "简单例子"}'
换句话说,有点乱。
关于如何处理这种嵌套结构,其中某些元素无法直接序列化,有什么建议吗?我想我也许可以让 jsonext 工作,但它的 Dict mixin 期望找到一个合适的(在它的脑海中) to_dict() 方法。 DataFrame.to_dict() 似乎没有返回正确的东西。 (虽然我会继续玩它。)
我想这一定是一只已经被剥皮的猫。我只是还没有找到它。我现在很高兴没有比我的示例更分层的东西(尽管有更多的键/值对),但我不会对更通用的解决方案嗤之以鼻。
【问题讨论】: