pandas读json没有在MultiIndex上工作

时间:2014-03-31 17:52:27

标签: python json pandas

我尝试通过df.to_json()读取通过pd.read_json创建的数据框,但我获得了ValueError。我认为它可能与索引是MultiIndex的事实有关,但我不知道如何处理它。

55k行的原始数据框称为psi,我通过以下方式创建了test.json

psi.head().to_json('test.json')

Hereprint 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的生成方式。

4 个答案:

答案 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)