将Pandas DataFrame转换为JSON作为更大数据结构的元素

smo*_*aro 7 python json pandas

我一直在服务器中使用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,
... }
Run Code Online (Sandbox Code Playgroud)

毫不奇怪,无法使用json模块直接序列化.我找到了jsonext模块并试了一下.它"有效",但产生不完整的结果:

>>> jsonext.dumps(result)
'{"data": ["0"], "name": "Simple Example"}'
Run Code Online (Sandbox Code Playgroud)

看看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}}
Run Code Online (Sandbox Code Playgroud)

但正如您所看到的,它们无法序列化为JSON,因为键不是字符串.

df.to_json()看起来可能会起作用,不过我最后会在另一个JSON字符串中嵌入一个JSON字符串.像这样的东西:

json.dumps({"name":"简单示例","数据":df.to_json()})'{"data":"{\"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}}","name":"简单示例"}'

换句话说,有点乱.

有关如何处理这种嵌套结构的任何建议,其中某些元素无法直接序列化?我想我可以让jsonext工作,但它的Dict mixin希望找到一个合适的(在它的脑海中)to_dict()方法.DataFrame.to_dict()似乎没有返回正确的东西.(虽然我会继续用它来骑马.)

我认为这必须是一只已经剥皮的猫.我还没找到它.我现在很高兴没有更多层次结构,而不是像我的例子那样(尽管有更多的键/值对),尽管我不会在更通用的解决方案上嗤之以鼻.

unu*_*tbu 9

default功能(供给json.dumps)被要求不能在默认情况下被序列化的所有对象.它可以返回默认编码器可以序列化的任何对象,例如dict.

df.to_json()返回一个字符串.json.loads(df.to_json)返回一个带有字符串键的字典.因此,如果我们设置,default=lambda df: json.loads(df.to_json())那么DataFrame将被序列化,就像它是一个字典.

import json
import numpy as np
import pandas as pd

z = np.zeros(10)
df = pd.DataFrame(z)
result = {"name": "Simple Example",
          "data": df, }

jstr = json.dumps(result,
                   default=lambda df: json.loads(df.to_json()))
newresult = json.loads(jstr)
print(newresult)
# {u'data': {u'0': {u'0': 0.0,
#    u'1': 0.0,
#    u'2': 0.0,
#    u'3': 0.0,
#    u'4': 0.0,
#    u'5': 0.0,
#    u'6': 0.0,
#    u'7': 0.0,
#    u'8': 0.0,
#    u'9': 0.0}},
#  u'name': u'Simple Example'}


print(pd.DataFrame(newresult['data']))
Run Code Online (Sandbox Code Playgroud)

产量

   0
0  0
1  0
2  0
3  0
4  0
5  0
6  0
7  0
8  0
9  0
Run Code Online (Sandbox Code Playgroud)


smo*_*aro 1

我认为有必要更多地阅读 jsonext 文档。看起来我可以创建自己的 mixin,它知道如何正确编码我的 DataFrame 对象,然后调用 jsonext.dumps(result)。我被 DataFrame 对象现有的 to_dict() 和 to_json() 方法所吸引,但它们并不能真正解决问题。