将包含pandas对象(系列/数据帧)的python元组,列表,字典转换为json

时间:2016-09-29 10:48:39

标签: python json pandas

我知道我可以将像SeriesDataFrame这样的pandas对象转换为json,如下所示:

series1 = pd.Series(np.random.randn(5), name='something')
jsonSeries1 = series1.to_json() #{"0":0.0548079371,"1":-0.9072821424,"2":1.3865642993,"3":-1.0609052074,"4":-3.3513341839}

但是当该系列封装在其他数据结构中时,我应该怎么做,比如字典如下:

seriesmap = {"key1":pd.Series(np.random.randn(5), name='something')}

如何将上面的地图转换为json,如下所示:

{"key1":{"0":0.0548079371,"1":-0.9072821424,"2":1.3865642993,"3":-1.0609052074,"4":-3.3513341839}}

simplejson不起作用:

 jsonObj = simplejson.dumps(seriesmap)

给出

Traceback (most recent call last):
  File "C:\..\py2.py", line 86, in <module>
    jsonObj = json.dumps(seriesmap)
  File "C:\Mahesh\Program Files\WinPython-64bit-3.4.4.4Qt5\python-3.4.4.amd64\lib\site-packages\simplejson\__init__.py", line 380, in dumps
    return _default_encoder.encode(obj)
  File "C:\Mahesh\Program Files\WinPython-64bit-3.4.4.4Qt5\python-3.4.4.amd64\lib\site-packages\simplejson\encoder.py", line 275, in encode
    chunks = self.iterencode(o, _one_shot=True)
  File "C:\Mahesh\Program Files\WinPython-64bit-3.4.4.4Qt5\python-3.4.4.amd64\lib\site-packages\simplejson\encoder.py", line 357, in iterencode
    return _iterencode(o, 0)
  File "C:\Mahesh\Program Files\WinPython-64bit-3.4.4.4Qt5\python-3.4.4.amd64\lib\site-packages\simplejson\encoder.py", line 252, in default
    raise TypeError(repr(o) + " is not JSON serializable")
TypeError: 0   -0.038824
1   -0.047297
2   -0.887672
3   -1.510238
4    0.900217
Name: something, dtype: float64 is not JSON serializable

为了进一步概括,我想将任意对象转换为json。任意对象可以是简单的int,字符串或复杂类型,使得包含pandas对象的元组,列表,字典以及其他类型。在字典中,pandas对象可以位于任意深度作为一些关键值。我想安全地将这种结构转换为有效的json。有可能吗?

更新

我只是尝试将DataFrame封装为字典的一个键的值,并通过封装在另一个DataFrame中将该字典转换为json(如下面的答案所示)。但似乎它不起作用:

import pandas as pd

d = {'one' : pd.Series([1., 2., 3.], index=['a', 'b', 'c']),
    'two' : pd.Series([1., 2., 3., 4.], index=['a', 'b', 'c', 'd'])}

df = pd.DataFrame(d)

mapDict = {"key1":df}
print(pd.DataFrame(mapDict).to_json())

这给了:

Traceback (most recent call last):
  File "C:\Mahesh\repos\JavaPython\JavaPython\bin\py2.py", line 80, in <module>
    print(pd.DataFrame(mapDict).to_json())
  File "C:\Mahesh\Program Files\WinPython-64bit-3.4.4.4Qt5\python-3.4.4.amd64\lib\site-packages\pandas\core\frame.py", line 224, in __init__
    mgr = self._init_dict(data, index, columns, dtype=dtype)
  File "C:\Mahesh\Program Files\WinPython-64bit-3.4.4.4Qt5\python-3.4.4.amd64\lib\site-packages\pandas\core\frame.py", line 360, in _init_dict
    return _arrays_to_mgr(arrays, data_names, index, columns, dtype=dtype)
  File "C:\Mahesh\Program Files\WinPython-64bit-3.4.4.4Qt5\python-3.4.4.amd64\lib\site-packages\pandas\core\frame.py", line 5231, in _arrays_to_mgr
    index = extract_index(arrays)
  File "C:\Mahesh\Program Files\WinPython-64bit-3.4.4.4Qt5\python-3.4.4.amd64\lib\site-packages\pandas\core\frame.py", line 5270, in extract_index
    raise ValueError('If using all scalar values, you must pass'
ValueError: If using all scalar values, you must pass an index

2 个答案:

答案 0 :(得分:1)

pd.DataFrame上致电seriesmap,然后使用to_json

pd.DataFrame(seriesmap).to_json()

'{"key1":{"0":0.8513342674,"1":-1.3357052602,"2":0.2102391775,"3":-0.5957492995,"4":0.2356552588}}'

答案 1 :(得分:0)

到目前为止,还没有一个实用程序可以对包含Pandas对象的嵌套Python结构进行序列化或反序列化。甚至PyArrow(由Google开发)也无法处理复数。因此,如果要使用它,则需要编写自己的代码。

我最近开发了一个库(https://github.com/xuancong84/pandas-serializer),该库可以对Python中的几乎所有内容进行序列化/反序列化。您可以尝试一下,并向我报告不能完全反序列化的内容。谢谢! -:)