当使用选项orient='split'时,Pandas DataFrame .to_json未按.read_json预期的方式读取

yiytaume  于 12个月前  发布在  其他
关注(0)|答案(1)|浏览(116)

我正在将一个pandas DataFrame转换为JSON进行存储,希望以后能够从JSON重新创建DataFrame。原始DataFrame是多索引的。
我想使用orient='split'选项来分隔索引、列和数据。创建json可以正常工作。但是当我试图读回它时,索引被转置了。当我的索引列数与行数相同时,这是显而易见的。更糟糕的是,如果索引中的行数和列数不同(通常情况下......),我会得到一个ValueError。
这是一个bug吗(使用pandas版本1.2.4)?有没有一个简单的方法来解决这个问题?我更喜欢以“split”格式存储DataFrame。

mindex=['A','B','C']
df = pd.DataFrame({
   'A': ['foo', 'bar', 'baz'],
   'B': ['one', 'two', 'three'],
   'C': [1, 2, 3],
   'vals':[1.1,2.2, 3.3]
    }).set_index(mindex)    
print(df)
result = df.to_json(orient='split')
print(result)
df_r = pd.read_json(result, orient='split').rename_axis(mindex)
print(df_r)

字符串
上面的结果如下

vals
A   B     C      
foo one   1   1.1
bar two   2   2.2
baz three 3   3.3

{"columns": ["vals"], "index": [["foo", "one", 1], ["bar", "two", 2], ["baz", "three", 3]], "data": [[1.1], [2.2], [3.3]]}

               vals
A   B   C          
foo bar baz     1.1
one two three   2.2
1   2   3       3.3


显然,索引在df_r中转置
更改为mindex=['A','B']或添加另一行数据会引发ValueError,如下所示:

ValueError: Shape of passed values is (3, 2), indices imply (2, 2)


我希望.read_json能够重新创建用.to_json序列化的框架,除了索引名称。

hyrbngr7

hyrbngr71#

您需要对df_r索引进行**transpose,为此,使用reset_index()将索引转换为列,并且只获取索引中具有[mindex]表达式的列,然后使用T将其转置,最后使用set_index()将获得的multiIndex**定义为索引。

df_r = df_r.set_index(pd.MultiIndex.from_frame(df_r.reset_index()[mindex].T))

字符串

import json
result = json.loads(result)
df_r = pd.DataFrame(data=result['data'], columns=result['columns'], index = pd.MultiIndex.from_tuples(result['index']))

相关问题