我知道我可以将像Series
,DataFrame
这样的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
答案 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中的几乎所有内容进行序列化/反序列化。您可以尝试一下,并向我报告不能完全反序列化的内容。谢谢! -:)