我尝试通过df.to_json()
读取通过pd.read_json
创建的数据框,但我获得了ValueError
。我认为它可能与索引是MultiIndex的事实有关,但我不知道如何处理它。
55k行的原始数据框称为psi
,我通过以下方式创建了test.json
:
psi.head().to_json('test.json')
Here是print psi.head().to_string()
的输出,如果你想使用它。
当我在这一小组数据(5行)上执行此操作时,我得到ValueError
。
! wget --no-check-certificate https://gist.githubusercontent.com/olgabot/9897953/raw/c270d8cf1b736676783cc1372b4f8106810a14c5/test.json
import pandas as pd
pd.read_json('test.json')
这里是完整的堆栈:
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
<ipython-input-14-1de2f0e65268> in <module>()
1 get_ipython().system(u' wget https://gist.githubusercontent.com/olgabot/9897953/raw/c270d8cf1b736676783cc1372b4f8106810a14c5/test.json'>)
2 import pandas as pd
----> 3 pd.read_json('test.json')
/home/obot/virtualenvs/envy/lib/python2.7/site-packages/pandas/io/json.pyc in read_json(path_or_buf, orient, typ, dtype, convert_axes, convert_dates, keep_default_dates, numpy, precise_float, date_unit)
196 obj = FrameParser(json, orient, dtype, convert_axes, convert_dates,
197 keep_default_dates, numpy, precise_float,
--> 198 date_unit).parse()
199
200 if typ == 'series' or obj is None:
/home/obot/virtualenvs/envy/lib/python2.7/site-packages/pandas/io/json.pyc in parse(self)
264
265 else:
--> 266 self._parse_no_numpy()
267
268 if self.obj is None:
/home/obot/virtualenvs/envy/lib/python2.7/site-packages/pandas/io/json.pyc in _parse_no_numpy(self)
481 if orient == "columns":
482 self.obj = DataFrame(
--> 483 loads(json, precise_float=self.precise_float), dtype=None)
484 elif orient == "split":
485 decoded = dict((str(k), v)
ValueError: No ':' found when decoding object value
> /home/obot/virtualenvs/envy/lib/python2.7/site-packages/pandas/io/json.py(483)_parse_no_numpy()
482 self.obj = DataFrame(
--> 483 loads(json, precise_float=self.precise_float), dtype=None)
484 elif orient == "split":
但是当我在整个数据帧(55k行)上执行它时,我得到一个invalid pointer error并且IPython内核死掉了。有什么想法吗?
编辑:首先添加了json的生成方式。
答案 0 :(得分:10)
这不是ATM实现的,请参阅此处的问题:https://github.com/pydata/pandas/issues/4889。
您可以先简单地重置索引,例如
df.reset_index().to_json(...)
它会起作用。
答案 1 :(得分:1)
或者您也可以使用orient ='table'来写json
df.to_json(path_or_buf='test.json', orient='table')
读取multi_index json
pd.read_json('test.json', orient='table')
答案 2 :(得分:0)
如果要返回MultiIndex结构:
# save MultiIndex indexes names
indexes_names = df.index.names
df.reset_index().to_json('dump.json')
# return back MultiIndex structure:
loaded_df = pd.read_json('dump.json').set_index(indexes_names)
答案 3 :(得分:0)
这是我用于编码/解码多索引熊猫数据帧的简单脏修复,它似乎也适用于索引/列中的日期时间......未优化!
这里是 json 的编码器 - 我将数据帧、索引和列编码到一个 dict 中以创建一个 json
import json
import pandas as pd
def to_json_multiindex(df):
dfi = df.index.to_frame()
dfc = df.columns.to_frame()
d = dict(
df = df.to_json(),
di = dfi.to_json(),
dc = dfc.to_json()
)
return json.dumps(d)
同时这里是读取json dict并重新创建数据帧的解码器
def read_json_multiindex(j):
d = json.loads(j)
di=pd.read_json(d['di'])
if di.shape[1]>1:
di = pd.MultiIndex.from_frame(di)
else:
_name = di.columns[0]
di = di.index
di.name = _name
dc=pd.read_json(d['dc'])
if dc.shape[1]>1:
dc = pd.MultiIndex.from_frame(dc)
else:
_name = dc.columns[0]
dc = dc.index
dc.name = _name
df = pd.read_json(d['df']).values
return pd.DataFrame(
data=df,
index=di,
columns=dc,
)
这里是对多索引列和索引的测试...似乎保留了数据框。几个问题 1) 可能效率低下和 2) 似乎对多索引中的数据时间有效(但在它不是多索引时有效)
df = pd.DataFrame(
data = [[0,1,2],[2,3,4],[5,6,7]],
index = pd.MultiIndex.from_tuples(
(('aa','bb'),('aa','cc'),('bb','cc')
),
names=['AA','BB']),
columns = pd.MultiIndex.from_tuples(
(('XX','YY'),('XX','ZZ'),('YY','ZZ')
),
names=['YY','ZZ'])
)
j = to_json_multiindex(df)
d = read_json_multiindex(j)