我正在将一个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序列化的框架,除了索引名称。
1条答案
按热度按时间hyrbngr71#
您需要对
df_r
索引进行**transpose
,为此,使用reset_index()
将索引转换为列,并且只获取索引中具有[mindex]
表达式的列,然后使用T
将其转置,最后使用set_index()
将获得的multiIndex
**定义为索引。字符串
或:
型