将python元组、列表、包含pandas对象(series/dataframes)的字典转换为json

2024-09-22 22:28:19 发布

您现在位置:Python中文网/ 问答频道 /正文

我知道我可以像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}

不过,其他数据结构封装在字典里的时候我应该怎么说:

^{pr2}$

如何将上述映射转换为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、string或复杂类型,比如tuple、list、dictionary,其中包含pandas对象以及其他类型。在字典中,pandas对象可以作为某个键的值位于任意深度。我希望将这种结构安全地转换为有效的json。有可能吗?在

更新

我只是尝试将DataFrame封装为dictionary的某个键的值,并通过封装到另一个DataFrame中(如下面的答案所示),将该dictionary转换为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

Tags: inpyjsonpandaslibpackageslinesite